diff --git a/ccv/chains/evm/gobindings/generated/latest/lombard_token_pool/lombard_token_pool.go b/ccv/chains/evm/gobindings/generated/latest/lombard_token_pool/lombard_token_pool.go index 779fcb4de6..9dd4f59d27 100644 --- a/ccv/chains/evm/gobindings/generated/latest/lombard_token_pool/lombard_token_pool.go +++ b/ccv/chains/evm/gobindings/generated/latest/lombard_token_pool/lombard_token_pool.go @@ -38,6 +38,11 @@ type IPoolV2TokenTransferFeeConfig struct { IsEnabled bool } +type LombardTokenPoolPath struct { + AllowedCaller [32]byte + LChainId [32]byte +} + type PoolLockOrBurnInV1 struct { Receiver []byte RemoteChainSelector uint64 @@ -101,15 +106,15 @@ type TokenPoolTokenTransferFeeConfigArgs struct { } var LombardTokenPoolMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contract IERC20Metadata\"},{\"name\":\"verifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"advancedPoolHooks\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fallbackDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"struct TokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyTokenTransferFeeConfigUpdates\",\"inputs\":[{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"struct TokenPool.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"struct IPoolV2.TokenTransferFeeConfig\",\"components\":[{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"customBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"customBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"disableTokenTransferFeeConfigs\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"customBlockConfirmation\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"outboundRateLimiterState\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterState\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"feeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinBlockConfirmation\",\"inputs\":[],\"outputs\":[{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRequiredCCVs\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"direction\",\"type\":\"uint8\",\"internalType\":\"enum IPoolV2.MessageDirection\"}],\"outputs\":[{\"name\":\"requiredCCVs\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contract IERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"feeConfig\",\"type\":\"tuple\",\"internalType\":\"struct IPoolV2.TokenTransferFeeConfig\",\"components\":[{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"customBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"customBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVerifierResolver\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"lockOrBurnOut\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"tokenArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"lockOrBurnOut\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"destTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourceDenominatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"releaseOrMintOut\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourceDenominatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinBlockConfirmation\",\"inputs\":[{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitConfig\",\"inputs\":[{\"name\":\"rateLimitConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"struct TokenPool.RateLimitConfigArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"customBlockConfirmation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawFeeTokens\",\"inputs\":[{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CustomBlockConfirmationInboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CustomBlockConfirmationOutboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LockedOrBurned\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LombardVerifierSet\",\"inputs\":[{\"name\":\"verifier\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinBlockConfirmationSet\",\"inputs\":[{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"customBlockConfirmation\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReleasedOrMinted\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigDeleted\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct IPoolV2.TokenTransferFeeConfig\",\"components\":[{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"customBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"customBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustomBlockConfirmationsNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMinBlockConfirmation\",\"inputs\":[{\"name\":\"requested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidTransferFeeBps\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutboundImplementationNotFoundForVerifier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroVerifierNotAllowed\",\"inputs\":[]}]", - Bin: "0x610120806040523461024e5760c0816151c18038038091610020828561029f565b83398101031261024e578051906001600160a01b03821680830361024e5761004a602083016102d8565b92610057604084016102d8565b91610086610067606086016102d8565b9261008060a0610079608089016102d8565b97016102ec565b906102fa565b91331561028e57600180546001600160a01b031916331790558115801561027d575b801561026c575b61025b578160209160049360805260c0526040519283809263313ce56760e01b82525afa6000918161021a575b506101ef575b5060a0526001600160a01b0390811660e052600280546001600160a01b0319169282169290921790915581169081156101de5761010052604051907fa817b8930bcb4b25cbd026589d9815aceaf8ec0882ebf9bdf32f1e22f69ff745600080a2614e509081610371823960805181818161169d01528181612500015281816126f6015281816127f201528181612aa901528181612dd40152612e2e015260a0518181816119ca01528181612c9a01528181613d980152613e1b015260c051818181610cae01528181611779015261259b015260e0518181816119200152818161275e01526137d501526101005181818161164a0152612ee00152f35b639533e8c360e01b60005260046000fd5b60ff1660ff821681810361020357506100e2565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d602011610253575b816102366020938361029f565b8101031261024e57610247906102ec565b90386100dc565b600080fd5b3d9150610229565b630a64406560e11b60005260046000fd5b506001600160a01b038116156100af565b506001600160a01b038516156100a8565b639b15e16f60e01b60005260046000fd5b601f909101601f19168101906001600160401b038211908210176102c257604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361024e57565b519060ff8216820361024e57565b60405163313ce56760e01b815290602090829060049082906001600160a01b03165afa60009181610334575b5061032f575090565b905090565b9091506020813d602011610368575b816103506020938361029f565b8101031261024e57610361906102ec565b9038610326565b3d915061034356fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612f045750806305e20b2b14612eb3578063181f5a7714612e5257806321df0da714612e01578063240028e814612d9d5780632422ac4514612cbe57806324f65ee714612c805780632c06340414612be75780633907753714612ba4578063489a68f21461245a5780634c5ef0ed146124135780634e921c301461237457806362ddd3c4146122ed5780637437ff9f146122ac57806379ba5097146121e55780638926f54f1461219f57806389720a62146120d85780638da5cb5b146120a45780639a4575b914612053578063a42a7b8b14611eec578063acfecf9114611df4578063b1c71c651461156f578063b794658014611532578063c4bffe2b14611407578063c7230a601461125d578063d8aa3f4014611123578063dc04fa1f14610cd2578063dc0bd97114610c81578063dcbd41bc14610a7d578063e8a1da17146103b9578063f2fde38b146102ea578063fa41d79c146102c55763ff8e03f31461018c57600080fd5b346102c25760406003193601126102c2576101a561317f565b906101ae6131ca565b6101b6613f3d565b73ffffffffffffffffffffffffffffffffffffffff831692831561029a577f22a0dbb8195755fbfc99667a86ae684c568e9dfbb1eccf7f90084e616644797092937fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025573ffffffffffffffffffffffffffffffffffffffff82167fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556102946040519283928390929173ffffffffffffffffffffffffffffffffffffffff60209181604085019616845216910152565b0390a180f35b6004837f14c880ca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102c257806003193601126102c257602061ffff60025460a01c16604051908152f35b50346102c25760206003193601126102c25773ffffffffffffffffffffffffffffffffffffffff61031961317f565b610321613f3d565b1633811461039157807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b50346102c25760406003193601126102c25760043567ffffffffffffffff81116108d6576103eb903690600401613381565b9060243567ffffffffffffffff8111610a79579061040e84923690600401613381565b939091610419613f3d565b83905b8282106108de5750505081927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee182360301935b818110156108da578060051b830135858112156108d2578301610120813603126108d2576040519461048086613089565b6104898261323c565b8652602082013567ffffffffffffffff81116108d65782019436601f870112156108d6578535956104b987613740565b966104c760405198896130a5565b80885260208089019160051b830101903682116108d25760208301905b82821061089f575050505060208701958652604083013567ffffffffffffffff811161089b5761051790369085016132f4565b916040880192835261054161052f3660608701613b9d565b9460608a0195865260c0369101613b9d565b9560808901968752835151156108735761056567ffffffffffffffff8a5116614a06565b1561083c5767ffffffffffffffff895116825260076020526040822061058c865182614379565b61059a885160028301614379565b6004855191019080519067ffffffffffffffff821161080f576105bd83546139eb565b601f81116107d4575b50602090601f831160011461073557610614929186918361072a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b815b8851805182101561064e57906106486001926106418367ffffffffffffffff8f5116926139a8565b5190613f88565b01610619565b5050977f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c293919997509561071c67ffffffffffffffff60019796949851169251935191516106e86106b360405196879687526101006020880152610100870190613120565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101939290919361044f565b015190508e806105e2565b83865281862091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416875b8181106107bc5750908460019594939210610785575b505050811b019055610617565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558d8080610778565b92936020600181928786015181550195019301610762565b6107ff9084875260208720601f850160051c81019160208610610805575b601f0160051c0190613c39565b8d6105c6565b90915081906107f2565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60248267ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b6004827f14c880ca000000000000000000000000000000000000000000000000000000008152fd5b8280fd5b813567ffffffffffffffff81116108ce576020916108c383928336918901016132f4565b8152019101906104e4565b8680fd5b8480fd5b5080fd5b8380f35b9267ffffffffffffffff6109006108fb8486889a9699979a613b22565b6136ee565b169161090b83614669565b15610a4d57828452600760205261092760056040862001614606565b94845b865181101561096057600190858752600760205261095960056040892001610952838b6139a8565b51906147ff565b500161092a565b509396929094509490948087526007602052600560408820888155886001820155886002820155886003820155886004820161099c81546139eb565b80610a0c575b50505001805490888155816109ee575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a10190919493929461041c565b885260208820908101905b818110156109b2578881556001016109f9565b601f8111600114610a225750555b888a806109a2565b81835260208320610a3d91601f01861c810190600101613c39565b8082528160208120915555610a1a565b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b8380fd5b50346102c25760206003193601126102c25760043567ffffffffffffffff81116108d657610aaf9036906004016133b2565b73ffffffffffffffffffffffffffffffffffffffff6009541633141580610c5f575b610c3357825b818110610ae2578380f35b610aed818385613b32565b67ffffffffffffffff610aff826136ee565b1690610b18826000526006602052604060002054151590565b15610c0757907f41f7c8f7cfdad9350aa495e6c54cbbf750a07ab38a9098aed1256e30dd1682bb60e083610bc7610ba1602060019897018b610b5982613b42565b15610bce578790526003602052610b8060408d20610b7a3660408801613b9d565b90614379565b868c526004602052610b9c60408d20610b7a3660a08801613b9d565b613b42565b916040519215158352610bba6020840160408301613bf5565b60a0608084019101613bf5565ba201610ad7565b60026040828a610b9c94526007602052610bf0828220610b7a36858c01613b9d565b8a815260076020522001610b7a3660a08801613b9d565b602486837f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610ad1565b50346102c257806003193601126102c257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102c25760406003193601126102c25760043567ffffffffffffffff81116108d657610d049036906004016133b2565b60243567ffffffffffffffff8111610a7957610d24903690600401613381565b919092610d2f613f3d565b845b828110610d9b57505050825b818110610d48578380f35b8067ffffffffffffffff610d626108fb6001948688613b22565b16808652600a6020528560408120557f5479bbc0288b7eaeaf2ace0943b88016cc648964fcd42919a86fd93b15fdbee88680a201610d3d565b610da96108fb828585613b32565b610db4828585613b32565b90602082019060e0830190610dc882613b42565b156110ee5760a0840161271061ffff610de083613b4f565b1610156110df5760c085019161271061ffff610dfb85613b4f565b1610156110a75763ffffffff610e1086613b5e565b16156110725767ffffffffffffffff1694858c52600a60205260408c20610e3686613b5e565b63ffffffff16908054906040840191610e4e83613b5e565b60201b67ffffffff0000000016936060860194610e6a86613b5e565b60401b6bffffffff0000000000000000169660800196610e8988613b5e565b60601b6fffffffff0000000000000000000000001691610ea88a613b4f565b60801b71ffff000000000000000000000000000000001693610ec98c613b4f565b60901b73ffff00000000000000000000000000000000000016957fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016177fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16177fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff16177fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff161717178155610f7c87613b42565b81547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff00000000000000000000000000000000000000001617905560405196610fcd90613b6f565b63ffffffff168752610fde90613b6f565b63ffffffff166020870152610ff290613b6f565b63ffffffff16604086015261100690613b6f565b63ffffffff16606085015261101a90613280565b61ffff16608084015261102c90613280565b61ffff1660a083015261103e90613251565b151560c082015260e07ffae1e296719dac5269c3886fb5002bb29bf17ae403060c6eb063a55abaaa104191a2600101610d31565b7f12332265000000000000000000000000000000000000000000000000000000008c5267ffffffffffffffff1660045260248bfd5b60248c61ffff6110b686613b4f565b7f95f3517a00000000000000000000000000000000000000000000000000000000835216600452fd5b8a61ffff6110b6602493613b4f565b7f12332265000000000000000000000000000000000000000000000000000000008a5267ffffffffffffffff16600452602489fd5b50346102c25760806003193601126102c25761113d61317f565b50611146613225565b61114e61326f565b5060643567ffffffffffffffff811161089b579167ffffffffffffffff60409261117e60e095369060040161328f565b50508260c0855161118e8161306d565b82815282602082015282878201528260608201528260808201528260a08201520152168152600a60205220604051906111c68261306d565b5461ffff818163ffffffff82169485815263ffffffff60208201818560201c1681528160408401818760401c168152816060860193818960601c16855260ff60c060808901988a8c60801c168a528a60a082019c60901c168c52019b60a01c1615158b526040519b8c52511660208b0152511660408901525116606087015251166080850152511660a083015251151560c0820152f35b50346102c25760406003193601126102c25760043567ffffffffffffffff81116108d65761128f903690600401613381565b906112986131ca565b6112a0613f3d565b835b8381106112ad578480f35b80602073ffffffffffffffffffffffffffffffffffffffff6112da6112d56024958989613b22565b6136cd565b16604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa80156113fc5786906113c6575b600192508061132b575b50016112a2565b611359818573ffffffffffffffffffffffffffffffffffffffff6113536112d5878c8c613b22565b166141f2565b73ffffffffffffffffffffffffffffffffffffffff61137c6112d5848989613b22565b60405192835216907f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e602073ffffffffffffffffffffffffffffffffffffffff871692a338611324565b509060203d81116113f5575b6113dc81836130a5565b602082600092810103126102c25750906001915161131a565b503d6113d2565b6040513d88823e3d90fd5b50346102c257806003193601126102c257604051906005548083528260208101600584526020842092845b818110611519575050611447925003836130a5565b815161146b61145582613740565b9161146360405193846130a5565b808352613740565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b84518110156114ca578067ffffffffffffffff6114b7600193886139a8565b51166114c382866139a8565b5201611498565b50925090604051928392602084019060208552518091526040840192915b8181106114f6575050500390f35b825167ffffffffffffffff168452859450602093840193909201916001016114e8565b8454835260019485019487945060209093019201611432565b50346102c25760206003193601126102c25761156b61155761155261320e565b613b00565b604051918291602083526020830190613120565b0390f35b50346102c25760606003193601126102c2576004359067ffffffffffffffff82116102c2578160040160a060031984360301126108d6576115ae61325e565b9060443567ffffffffffffffff8111610a79576115cf90369060040161328f565b9390946115da61398f565b5060248101956115e9876136ee565b9067ffffffffffffffff604051927f958021a70000000000000000000000000000000000000000000000000000000084521660048301526040602483015283604483015260208260648173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa918215611de9578492611dad575b5073ffffffffffffffffffffffffffffffffffffffff821615611d85576116dd907f0000000000000000000000000000000000000000000000000000000000000000976116cd606486013580958b6141f2565b6116d561398f565b5036916132bd565b60848301926116eb846136cd565b73ffffffffffffffffffffffffffffffffffffffff808a16911603611d3b5777ffffffffffffffff0000000000000000000000000000000061172c8a6136ee565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156113fc578691611d0c575b50611ce45767ffffffffffffffff6117c08a6136ee565b166117d8816000526006602052604060002054151590565b15611cb957602073ffffffffffffffffffffffffffffffffffffffff60025416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa80156113fc578690611c68575b73ffffffffffffffffffffffffffffffffffffffff9150163303611c3c5761ffff8716918215611baa5761ffff60025460a01c168015611b8257808410611b52575067ffffffffffffffff61188d8b6136ee565b1680875260036020527f61b04c91cb711a3783cc99d0de694ecd7ead5c96a0a87f5c89d436ac2097932885806118e08d73ffffffffffffffffffffffffffffffffffffffff60408d209116928391614abb565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a25b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169283611a30575b611a268a6119c26115528e61195c8e8e614933565b937ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae10606067ffffffffffffffff611992856136ee565b73ffffffffffffffffffffffffffffffffffffffff604051951685523360208601528860408601521692a26136ee565b9060405160ff7f0000000000000000000000000000000000000000000000000000000000000000166020820152602081526119fe6040826130a5565b60405192611a0b84613051565b83526020830152604051928392604084526040840190613357565b9060208301520390f35b833b156108ce578787959493928c8793604051998a98899788967f5c3af7ca000000000000000000000000000000000000000000000000000000008852600488016060905280611a7f916145b6565b6064890160a09052610104890190611a9692613779565b94611aa09061323c565b67ffffffffffffffff166084880152604401611abb906131ed565b73ffffffffffffffffffffffffffffffffffffffff1660a487015260c4860152611ae4906131ed565b73ffffffffffffffffffffffffffffffffffffffff1660e48501526024840152828103600319016044840152611b1991613120565b03925af18015611b4757611b32575b8080808080611947565b611b3d8280926130a5565b6102c25780611b28565b6040513d84823e3d90fd5b86604491857f7911d95b000000000000000000000000000000000000000000000000000000008352600452602452fd5b6004877f98d50fd7000000000000000000000000000000000000000000000000000000008152fd5b67ffffffffffffffff611bbc8b6136ee565b1680875260076020527fff0133389f9bb82d5b9385826160eaf2328039f6fa950eeb8cf0836da81789448580611c0f8d73ffffffffffffffffffffffffffffffffffffffff60408d209116928391614abb565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a2611909565b6024857f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b506020813d602011611cb1575b81611c82602093836130a5565b81010312611cad57611ca873ffffffffffffffffffffffffffffffffffffffff91613758565b611839565b8580fd5b3d9150611c75565b7fa9902c7e000000000000000000000000000000000000000000000000000000008652600452602485fd5b6004857f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b611d2e915060203d602011611d34575b611d2681836130a5565b810190613f25565b386117a9565b503d611d1c565b60248573ffffffffffffffffffffffffffffffffffffffff611d5c876136cd565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b6004847f7af97002000000000000000000000000000000000000000000000000000000008152fd5b9091506020813d602011611de1575b81611dc9602093836130a5565b81010312610a7957611dda90613758565b903861167a565b3d9150611dbc565b6040513d86823e3d90fd5b50346102c25767ffffffffffffffff611e0c36613312565b929091611e17613f3d565b1691611e30836000526006602052604060002054151590565b15610a4d578284526007602052611e5f60056040862001611e523684866132bd565b60208151910120906147ff565b15611ea457907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611e9e604051928392602084526020840191613779565b0390a280f35b82611ee8836040519384937f74f23c7c0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191613779565b0390fd5b50346102c25760206003193601126102c25767ffffffffffffffff611f0f61320e565b1681526007602052611f2660056040832001614606565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f6b611f5583613740565b92611f6360405194856130a5565b808452613740565b01835b818110612042575050825b8251811015611fbf5780611f8f600192856139a8565b5185526008602052611fa360408620613a3e565b611fad82856139a8565b52611fb881846139a8565b5001611f79565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b828210611ff757505050500390f35b91936020612032827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186528851613120565b9601920192018594939192611fe8565b806060602080938601015201611f6e565b50346102c25760206003193601126102c25760043567ffffffffffffffff81116108d65760031960a091360301126102c25761156b61209061398f565b604051918291602083526020830190613357565b50346102c257806003193601126102c257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102c25760c06003193601126102c2576120f261317f565b6120fa613225565b9060643561ffff81168103610a795760843567ffffffffffffffff81116108d25761212990369060040161328f565b9160a4359360028510156108ce5761214495604435916137b8565b90604051918291602083016020845282518091526020604085019301915b818110612170575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101612162565b50346102c25760206003193601126102c25760206121db67ffffffffffffffff6121c761320e565b166000526006602052604060002054151590565b6040519015158152f35b50346102c257806003193601126102c257805473ffffffffffffffffffffffffffffffffffffffff81163303612284577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b50346102c257806003193601126102c2576002546009546040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015290f35b50346102c2576122fc36613312565b61230893929193613f3d565b67ffffffffffffffff821661232a816000526006602052604060002054151590565b15612349575061234692936123409136916132bd565b90613f88565b80f35b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b50346102c25760206003193601126102c25760043561ffff81169081810361089b577fa7f8dbba8cdb126ce4a0e7939ec58e0161b70d808b585dd651d68e59d27e11fb916020916123c3613f3d565b7fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff75ffff00000000000000000000000000000000000000006002549260a01b16911617600255604051908152a180f35b50346102c25760406003193601126102c25761242d61320e565b906024359067ffffffffffffffff82116102c25760206121db8461245436600487016132f4565b90613703565b50346102c25760406003193601126102c2576004359067ffffffffffffffff82116102c257816004019161010060031982360301126108d65761249b61325e565b90826040516124a981613006565b5260c481019260648201356124d96124d36124ce6124c7888a61367c565b36916132bd565b613d24565b82613e18565b9460848401916124e8836136cd565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603612b8357602485019577ffffffffffffffff0000000000000000000000000000000061254e886136ee565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156113fc578691612b64575b50611ce45767ffffffffffffffff6125e2886136ee565b166125fa816000526006602052604060002054151590565b15611cb957602073ffffffffffffffffffffffffffffffffffffffff60025416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156113fc578691612b45575b5015611c3c57908893929161268a612679896136ee565b6124546124c760a48b01809961367c565b15612afe5761ffff16988915612a4a5767ffffffffffffffff6126ac896136ee565b1680875260046020527f0ca6b6e55c811717f7cba5bdd97184f0a2d5aa61e5ea64818392da5cef6ce6158a8061271e60408b2073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016928391614abb565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a25b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016928361283e575b50602089604489017ffc5e3a5bddc11d92c2dc20fae6f7d5eb989f056be35239f7de7e86150609abc0608067ffffffffffffffff6127d56127cf8f6127c9876136cd565b506136ee565b946136cd565b9373ffffffffffffffffffffffffffffffffffffffff60405195817f000000000000000000000000000000000000000000000000000000000000000016875233898801521660408601528560608601521692a28060405161283581613006565b52604051908152f35b869a849796973b156108ce57869289928b6040519a8b998a9889977f5eff3bf7000000000000000000000000000000000000000000000000000000008952600489016060905261288e87806145b6565b60648b0161010090526101648b01906128a692613779565b946128b09061323c565b67ffffffffffffffff1660848a01526044016128cb906131ed565b73ffffffffffffffffffffffffffffffffffffffff1660a489015260c48801526128f4906131ed565b73ffffffffffffffffffffffffffffffffffffffff1660e487015261291990846145b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8784030161010488015261294e9291613779565b9061295990836145b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8684030161012487015261298e9291613779565b9060e48b0161299c916145b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c858403016101448601526129d19291613779565b908b6024840152604483015203925af18015612a3f576127d56127cf60447ffc5e3a5bddc11d92c2dc20fae6f7d5eb989f056be35239f7de7e86150609abc09560209960809667ffffffffffffffff96612a2f575b50819750612785565b81612a39916130a5565b38612a26565b6040513d87823e3d90fd5b67ffffffffffffffff612a5c896136ee565b1680875260076020527f50f6fbee3ceedce6b7fd7eaef18244487867e6718aec7208187efb6b7908c14c8a80612ad1600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016928391614abb565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a2612747565b612b08858b61367c565b611ee86040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191613779565b612b5e915060203d602011611d3457611d2681836130a5565b38612662565b612b7d915060203d602011611d3457611d2681836130a5565b386125cb565b60248473ffffffffffffffffffffffffffffffffffffffff611d5c866136cd565b50346102c25760206003193601126102c25760043567ffffffffffffffff81116108d65760031961010091360301126102c2578060209160405161283581613006565b50346102c25760c06003193601126102c257612c0161317f565b50612c0a613225565b612c126131a7565b506084359161ffff831683036102c25760a4359067ffffffffffffffff82116102c25760a063ffffffff8061ffff612c598888612c523660048b0161328f565b50506134f7565b95926040979194975197885216602087015216604085015216606083015215156080820152f35b50346102c257806003193601126102c257602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102c25760406003193601126102c257612cd861320e565b6024359182151583036102c257610140612d9b612cf58585613474565b612d4b60409392935180946fffffffffffffffffffffffffffffffff6080809282815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b60a08301906fffffffffffffffffffffffffffffffff6080809282815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565bf35b50346102c25760206003193601126102c257602090612dba61317f565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b50346102c257806003193601126102c257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102c257806003193601126102c2575061156b604051612e756040826130a5565b601a81527f4c6f6d62617264546f6b656e506f6f6c20312e372e302d6465760000000000006020820152604051918291602083526020830190613120565b50346102c257806003193601126102c257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b9050346108d65760206003193601126108d6576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361089b57602092507faff2afbf000000000000000000000000000000000000000000000000000000008114908115612fdc575b8115612fb2575b8115612f88575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612f81565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150612f7a565b7f331710310000000000000000000000000000000000000000000000000000000081149150612f73565b6020810190811067ffffffffffffffff82111761302257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761302257604052565b60e0810190811067ffffffffffffffff82111761302257604052565b60a0810190811067ffffffffffffffff82111761302257604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761302257604052565b67ffffffffffffffff811161302257601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b84811061316a5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161312b565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036131a257565b600080fd5b6064359073ffffffffffffffffffffffffffffffffffffffff821682036131a257565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036131a257565b359073ffffffffffffffffffffffffffffffffffffffff821682036131a257565b6004359067ffffffffffffffff821682036131a257565b6024359067ffffffffffffffff821682036131a257565b359067ffffffffffffffff821682036131a257565b359081151582036131a257565b6024359061ffff821682036131a257565b6044359061ffff821682036131a257565b359061ffff821682036131a257565b9181601f840112156131a25782359167ffffffffffffffff83116131a257602083818601950101116131a257565b9291926132c9826130e6565b916132d760405193846130a5565b8294818452818301116131a2578281602093846000960137010152565b9080601f830112156131a25781602061330f933591016132bd565b90565b9060406003198301126131a25760043567ffffffffffffffff811681036131a257916024359067ffffffffffffffff82116131a2576133539160040161328f565b9091565b61330f9160206133708351604084526040840190613120565b920151906020818403910152613120565b9181601f840112156131a25782359167ffffffffffffffff83116131a2576020808501948460051b0101116131a257565b9181601f840112156131a25782359167ffffffffffffffff83116131a2576020808501948460081b0101116131a257565b604051906133f082613089565b60006080838281528260208201528260408201528260608201520152565b9060405161341b81613089565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff916134866133e3565b5061348f6133e3565b506134c35716600052600760205260406000209061330f6134b760026134bc6134b78661340e565b613c9f565b940161340e565b16908160005260036020526134de6134b7604060002061340e565b91600052600460205261330f6134b7604060002061340e565b9061ffff8060025460a01c1691169283151592838094613674575b61364a5767ffffffffffffffff16600052600a6020526040600020916040519261353b8461306d565b5463ffffffff81168452602084019563ffffffff8260201c168752604085019263ffffffff8360401c168452606086019163ffffffff8460601c168352608087019761ffff8560801c16895260ff60a089019561ffff8160901c16875260a01c1615801560c08a015261362f576135d0575050505063ffffffff808061ffff9351169451169551169351169193929190600190565b8193975080929450106135ff57505063ffffffff808061ffff9351169451169551169351169193929190600190565b7f7911d95b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b50505050505092505050600090600090600090600090600090565b7f98d50fd70000000000000000000000000000000000000000000000000000000060005260046000fd5b508215613512565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156131a2570180359067ffffffffffffffff82116131a2576020019181360383136131a257565b3573ffffffffffffffffffffffffffffffffffffffff811681036131a25790565b3567ffffffffffffffff811681036131a25790565b9067ffffffffffffffff61330f92166000526007602052600560406000200190602081519101209060019160005201602052604060002054151590565b67ffffffffffffffff81116130225760051b60200190565b519073ffffffffffffffffffffffffffffffffffffffff821682036131a257565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b95939192949073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001695861561396d576138719467ffffffffffffffff61ffff9373ffffffffffffffffffffffffffffffffffffffff6040519b7f89720a62000000000000000000000000000000000000000000000000000000008d521660048c01521660248a0152604489015216606487015260c0608487015260c4860191613779565b91600282101561393e578380600094819460a483015203915afa9081156139325760009161389d575090565b3d8083833e6138ac81836130a5565b81019060208183031261089b5780519067ffffffffffffffff8211610a79570181601f8201121561089b578051906138e382613740565b936138f160405195866130a5565b82855260208086019360051b8301019384116102c25750602001905b82821061391a5750505090565b6020809161392784613758565b81520191019061390d565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b50505050505050506040516139836020826130a5565b60008152600036813790565b6040519061399c82613051565b60606020838281520152565b80518210156139bc5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600182811c92168015613a34575b6020831014613a0557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916139fa565b9060405191826000825492613a52846139eb565b8084529360018116908115613ac05750600114613a79575b50613a77925003836130a5565b565b90506000929192526020600020906000915b818310613aa4575050906020613a779282010138613a6a565b6020919350806001915483858901015201910190918492613a8b565b60209350613a779592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613a6a565b67ffffffffffffffff16600052600760205261330f6004604060002001613a3e565b91908110156139bc5760051b0190565b91908110156139bc5760081b0190565b3580151581036131a25790565b3561ffff811681036131a25790565b3563ffffffff811681036131a25790565b359063ffffffff821682036131a257565b35906fffffffffffffffffffffffffffffffff821682036131a257565b91908260609103126131a2576040516060810181811067ffffffffffffffff821117613022576040526040613bf0818395613bd781613251565b8552613be560208201613b80565b602086015201613b80565b910152565b6fffffffffffffffffffffffffffffffff613c3360408093613c1681613251565b1515865283613c2760208301613b80565b16602087015201613b80565b16910152565b818110613c44575050565b60008155600101613c39565b81810292918115918404141715613c6357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211613c6357565b613ca76133e3565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff8083511691613d046020850193613cfe613cf163ffffffff87511642613c92565b8560808901511690613c50565b906145a9565b80821015613d1d57505b16825263ffffffff4216905290565b9050613d0e565b80518015613d9457602003613d565780516020828101918301839003126131a257519060ff8211613d56575060ff1690565b611ee8906040519182917f953576f7000000000000000000000000000000000000000000000000000000008352602060048401526024830190613120565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff8211613c6357565b60ff16604d8111613c6357600a0a90565b8115613de9570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff811692828414613f1e57828411613ef45790613e5d91613dba565b91604d60ff8416118015613ebb575b613e8557505090613e7f61330f92613dce565b90613c50565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50613ec583613dce565b8015613de9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613e6c565b613efd91613dba565b91604d60ff841611613e8557505090613f1861330f92613dce565b90613ddf565b5050505090565b908160209103126131a2575180151581036131a25790565b73ffffffffffffffffffffffffffffffffffffffff600154163303613f5e57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156141c85767ffffffffffffffff81516020830120921691826000526007602052613fbd816005604060002001614a66565b156141845760005260086020526040600020815167ffffffffffffffff811161302257613fea82546139eb565b601f8111614152575b506020601f821160011461408c5791614066827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea959361407c95600091614081575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9055604051918291602083526020830190613120565b0390a2565b905084015138614035565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b81811061413a57509261407c9492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610614103575b5050811b019055611557565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538806140f7565b9192602060018192868a0151815501940192016140bc565b61417e90836000526020600020601f840160051c8101916020851061080557601f0160051c0190613c39565b38613ff3565b5090611ee86040519283927f393b8ad20000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190613120565b7f14c880ca0000000000000000000000000000000000000000000000000000000060005260046000fd5b6040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff93841660248301526044808301959095529381526142c89290916142576064846130a5565b1660008060409586519461426b88876130a5565b602086527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020870152519082855af13d15614371573d916142ac836130e6565b926142b9875194856130a5565b83523d6000602085013e614d77565b805190816142d557505050565b6020806142e6938301019101613f25565b156142ee5750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b606091614d77565b8151919291156144fb576fffffffffffffffffffffffffffffffff6040840151166fffffffffffffffffffffffffffffffff6020850151161061449857613a7791925b805182547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff0000000000000000000000000000000000000000161782556020810151825460409290920151608090811b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9290921691821760018501557fffffffffffffffffffffffff0000000000000000000000000000000000000000909216174290911b73ffffffff0000000000000000000000000000000016179055565b6064836144f9604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b6fffffffffffffffffffffffffffffffff6040840151161580159061458a575b61452957613a7791926143bc565b6064836144f9604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff602084015116151561451b565b91908201809211613c6357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156131a257016020813591019167ffffffffffffffff82116131a25781360383136131a257565b906040519182815491828252602082019060005260206000209260005b818110614638575050613a77925003836130a5565b8454835260019485019487945060209093019201614623565b80548210156139bc5760005260206000200190600090565b60008181526006602052604090205480156147f8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613c6357600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613c6357818103614789575b505050600554801561475a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614717816005614651565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6147e061479a6147ab936005614651565b90549060031b1c9283926005614651565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260066020526040600020553880806146de565b5050600090565b906001820191816000528260205260406000205480151560001461492a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613c63578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613c63578181036148f3575b5050508054801561475a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906148b48282614651565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b6149136149036147ab9386614651565b90549060031b1c92839286614651565b90556000528360205260406000205538808061487c565b50505050600090565b9061ffff9067ffffffffffffffff61494d602085016136ee565b16600052600a602052604060002082604051916149698361306d565b549263ffffffff8416835263ffffffff8460201c16602084015263ffffffff8460401c16604084015263ffffffff8460601c166060840152818460801c169283608082015260c060ff848760901c16968760a085015260a01c1615159101521615156000146149ff57505b1680156149f7576127106149f0606061330f9401359283613c50565b0490613c92565b506060013590565b90506149d4565b80600052600660205260406000205415600014614a60576005546801000000000000000081101561302257614a476147ab8260018594016005556005614651565b9055600554906000526006602052604060002055600190565b50600090565b60008281526001820160205260409020546147f857805490680100000000000000008210156130225782614aa46147ab846001809601855584614651565b905580549260005201602052604060002055600190565b9182549060ff8260a01c16158015614d6f575b614d69576fffffffffffffffffffffffffffffffff82169160018501908154614b1363ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642613c92565b9081614ccb575b5050848110614c7f5750838310614b74575050614b496fffffffffffffffffffffffffffffffff928392613c92565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b9190915460801c928315614c135781614b8c91613c92565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613c6357614bda614bdf9273ffffffffffffffffffffffffffffffffffffffff966145a9565b613ddf565b7fd0c8d23a000000000000000000000000000000000000000000000000000000006000526004526024521660445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff83837fd0c8d23a000000000000000000000000000000000000000000000000000000006000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004526024521660445260646000fd5b828573ffffffffffffffffffffffffffffffffffffffff927f1a76572a000000000000000000000000000000000000000000000000000000006000526004526024521660445260646000fd5b828692939611614d3f57614ce692613cfe9160801c90613c50565b80841015614d3a5750825b85547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178655923880614b1a565b614cf1565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b508215614ace565b91929015614df25750815115614d8b575090565b3b15614d945790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614e055750805190602001fd5b611ee8906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260206004840152602483019061312056fea164736f6c634300081a000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contract IERC20Metadata\"},{\"name\":\"verifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bridge\",\"type\":\"address\",\"internalType\":\"contract IBridgeV1\"},{\"name\":\"adapter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"advancedPoolHooks\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fallbackDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"struct TokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyTokenTransferFeeConfigUpdates\",\"inputs\":[{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"struct TokenPool.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"struct IPoolV2.TokenTransferFeeConfig\",\"components\":[{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"customBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"customBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"disableTokenTransferFeeConfigs\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"customBlockConfirmation\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"outboundRateLimiterState\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterState\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"feeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"tokenFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLombardConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"verifierResolver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bridge\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdapter\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinBlockConfirmation\",\"inputs\":[],\"outputs\":[{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPath\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct LombardTokenPool.Path\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"lChainId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRequiredCCVs\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"direction\",\"type\":\"uint8\",\"internalType\":\"enum IPoolV2.MessageDirection\"}],\"outputs\":[{\"name\":\"requiredCCVs\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contract IERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"feeConfig\",\"type\":\"tuple\",\"internalType\":\"struct IPoolV2.TokenTransferFeeConfig\",\"components\":[{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"customBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"customBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_bridge\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contract IBridgeV1\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"lockOrBurnOut\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"tokenArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"lockOrBurnOut\",\"type\":\"tuple\",\"internalType\":\"struct Pool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"destTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourceDenominatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourceDenominatedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"blockConfirmationRequested\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Pool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePath\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinBlockConfirmation\",\"inputs\":[{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPath\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lChainId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"allowedCaller\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitConfig\",\"inputs\":[{\"name\":\"rateLimitConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"struct TokenPool.RateLimitConfigArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"customBlockConfirmation\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawFeeTokens\",\"inputs\":[{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CustomBlockConfirmationInboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CustomBlockConfirmationOutboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LockedOrBurned\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LombardConfigurationSet\",\"inputs\":[{\"name\":\"verifier\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"bridge\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenAdapter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinBlockConfirmationSet\",\"inputs\":[{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutboundRateLimitConsumed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PathRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"lChainId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PathSet\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"lChainId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RateLimitConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"customBlockConfirmation\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReleasedOrMinted\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigDeleted\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"struct IPoolV2.TokenTransferFeeConfig\",\"components\":[{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"customBlockConfirmationFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"customBlockConfirmationTransferFeeBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotSupported\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CustomBlockConfirmationsNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HashMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAllowedCaller\",\"inputs\":[{\"name\":\"allowedCaller\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"received\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMinBlockConfirmation\",\"inputs\":[{\"name\":\"requested\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minBlockConfirmation\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"struct RateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidTransferFeeBps\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutboundImplementationNotFoundForVerifier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PathNotExist\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RemoteTokenMismatch\",\"inputs\":[{\"name\":\"bridge\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"pool\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroBridge\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroLombardChainId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroVerifierNotAllowed\",\"inputs\":[]}]", + Bin: "0x610160806040523461031b576101008161696d803803809161002182856103f0565b83398101031261031b578051906001600160a01b03821680830361031b5761004b60208301610429565b6040830151926001600160a01b0384169283850361031b5761006f60608301610429565b9561007c60808401610429565b916100ab61008c60a08601610429565b926100a560e061009e60c08901610429565b970161043d565b9061044b565b9133156103df57600180546001600160a01b03191633179055811580156103ce575b80156103bd575b6103ac578160209160049360805260c0526040519283809263313ce56760e01b82525afa60009181610370575b50610345575b5060a0526001600160a01b0390811660e052600280546001600160a01b0319169290911691909117905581156103345760405163353c26b760e01b8152602081600481865afa8015610328576000906102e9575b60ff915016600181036102d057506001600160a01b0381169283156102bf576101005261012052610140839052604051926001600160a01b0316917f01d5dd7f15328f4241da3a1d9c7b310ae9ac14e8ca441203a7b6f71c7da0c49d600080a46164ab90816104c28239608051818181611792015281816122bc01528181612474015281816131b9015281816133ac01528181613488015281816137250152818161395201528181613b1c0152818161446201526144bc015260a051818181611ac601528181614328015281816154050152615488015260c051818181610da30152818161186e015281816123560152818161325401526139ed015260e051818181611a15015281816124fb0152818161341401528181613ba30152614e42015261010051818181610b0f015281816125bb01528181612df70152613c6a015261012051818181610ad6015261173f015261014051818181610b4b01526125670152f35b639533e8c360e01b60005260046000fd5b63398bbe0560e11b600052600160045260245260446000fd5b506020813d602011610320575b81610303602093836103f0565b8101031261031b5761031660ff9161043d565b61015b565b600080fd5b3d91506102f6565b6040513d6000823e3d90fd5b63361106cd60e01b60005260046000fd5b60ff1660ff82168181036103595750610107565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d6020116103a4575b8161038c602093836103f0565b8101031261031b5761039d9061043d565b9038610101565b3d915061037f565b630a64406560e11b60005260046000fd5b506001600160a01b038116156100d4565b506001600160a01b038516156100cd565b639b15e16f60e01b60005260046000fd5b601f909101601f19168101906001600160401b0382119082101761041357604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361031b57565b519060ff8216820361031b57565b60405163313ce56760e01b815290602090829060049082906001600160a01b03165afa60009181610485575b50610480575090565b905090565b9091506020813d6020116104b9575b816104a1602093836103f0565b8101031261031b576104b29061043d565b9038610477565b3d915061049456fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461454157508063181f5a77146144e057806321df0da71461448f578063240028e81461442b5780632422ac451461434c57806324f65ee71461430e5780632c0634041461427557806338ff8c381461420957806339077537146138e0578063489a68f2146131145780634c5ef0ed146130cd5780634e921c301461302e5780635fa1356514612ea257806362ddd3c414612e1b578063708e1f7914612dca5780637437ff9f14612d8957806379ba509714612cc25780638926f54f14612c7c57806389720a6214612bb55780638da5cb5b14612b815780639a4575b9146122455780639c893fe914612178578063a42a7b8b14612011578063acfecf9114611efb578063b1c71c6514611664578063b794658014611627578063c4bffe2b146114fc578063c7230a6014611352578063d8aa3f4014611218578063dc04fa1f14610dc7578063dc0bd97114610d76578063dcbd41bc14610b72578063dd65bdb114610aa9578063e8a1da17146103e5578063f2fde38b14610316578063fa41d79c146102f15763ff8e03f3146101b857600080fd5b346102ee5760406003193601126102ee576101d16147c3565b906101da614809565b6101e2615592565b73ffffffffffffffffffffffffffffffffffffffff83169283156102c6577f22a0dbb8195755fbfc99667a86ae684c568e9dfbb1eccf7f90084e616644797092937fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025573ffffffffffffffffffffffffffffffffffffffff82167fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556102c06040519283928390929173ffffffffffffffffffffffffffffffffffffffff60209181604085019616845216910152565b0390a180f35b6004837f14c880ca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102ee57806003193601126102ee57602061ffff60025460a01c16604051908152f35b50346102ee5760206003193601126102ee5773ffffffffffffffffffffffffffffffffffffffff6103456147c3565b61034d615592565b163381146103bd57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b50346102ee5760406003193601126102ee5760043567ffffffffffffffff8111610902576104179036906004016149c0565b9060243567ffffffffffffffff8111610aa5579061043a849236906004016149c0565b939091610445615592565b83905b82821061090a5750505081927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee182360301935b81811015610906578060051b830135858112156108fe578301610120813603126108fe57604051946104ac866146c6565b6104b58261487b565b8652602082013567ffffffffffffffff81116109025782019436601f87011215610902578535956104e587614e0d565b966104f360405198896146e2565b80885260208089019160051b830101903682116108fe5760208301905b8282106108cb575050505060208701958652604083013567ffffffffffffffff81116108c7576105439036908501614933565b916040880192835261056d61055b366060870161520a565b9460608a0195865260c036910161520a565b95608089019687528351511561089f5761059167ffffffffffffffff8a5116616061565b156108685767ffffffffffffffff89511682526007602052604082206105b88651826159d4565b6105c68851600283016159d4565b6004855191019080519067ffffffffffffffff821161083b576105e98354615058565b601f8111610800575b50602090601f8311600114610761576106409291869183610756575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b815b8851805182101561067a579061067460019261066d8367ffffffffffffffff8f511692615015565b51906155dd565b01610645565b5050977f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c293919997509561074867ffffffffffffffff60019796949851169251935191516107146106df60405196879687526101006020880152610100870190614780565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101939290919361047b565b015190508e8061060e565b83865281862091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416875b8181106107e857509084600195949392106107b1575b505050811b019055610643565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558d80806107a4565b9293602060018192878601518155019501930161078e565b61082b9084875260208720601f850160051c81019160208610610831575b601f0160051c01906152a6565b8d6105f2565b909150819061081e565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60248267ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b6004827f14c880ca000000000000000000000000000000000000000000000000000000008152fd5b8280fd5b813567ffffffffffffffff81116108fa576020916108ef8392833691890101614933565b815201910190610510565b8680fd5b8480fd5b5080fd5b8380f35b9267ffffffffffffffff61092c6109278486889a9699979a61518f565b614d3a565b169161093783615cc4565b15610a7957828452600760205261095360056040862001615c61565b94845b865181101561098c5760019085875260076020526109856005604089200161097e838b615015565b5190615e5a565b5001610956565b50939692909450949094808752600760205260056040882088815588600182015588600282015588600382015588600482016109c88154615058565b80610a38575b5050500180549088815581610a1a575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a101909194939294610448565b885260208820908101905b818110156109de57888155600101610a25565b601f8111600114610a4e5750555b888a806109ce565b81835260208320610a6991601f01861c8101906001016152a6565b8082528160208120915555610a46565b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b8380fd5b50346102ee57806003193601126102ee57606060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040820152f35b50346102ee5760206003193601126102ee5760043567ffffffffffffffff811161090257610ba49036906004016149f1565b73ffffffffffffffffffffffffffffffffffffffff6009541633141580610d54575b610d2857825b818110610bd7578380f35b610be281838561519f565b67ffffffffffffffff610bf482614d3a565b1690610c0d826000526006602052604060002054151590565b15610cfc57907f41f7c8f7cfdad9350aa495e6c54cbbf750a07ab38a9098aed1256e30dd1682bb60e083610cbc610c96602060019897018b610c4e826151af565b15610cc3578790526003602052610c7560408d20610c6f366040880161520a565b906159d4565b868c526004602052610c9160408d20610c6f3660a0880161520a565b6151af565b916040519215158352610caf6020840160408301615262565b60a0608084019101615262565ba201610bcc565b60026040828a610c9194526007602052610ce5828220610c6f36858c0161520a565b8a815260076020522001610c6f3660a0880161520a565b602486837f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610bc6565b50346102ee57806003193601126102ee57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102ee5760406003193601126102ee5760043567ffffffffffffffff811161090257610df99036906004016149f1565b60243567ffffffffffffffff8111610aa557610e199036906004016149c0565b919092610e24615592565b845b828110610e9057505050825b818110610e3d578380f35b8067ffffffffffffffff610e57610927600194868861518f565b16808652600a6020528560408120557f5479bbc0288b7eaeaf2ace0943b88016cc648964fcd42919a86fd93b15fdbee88680a201610e32565b610e9e61092782858561519f565b610ea982858561519f565b90602082019060e0830190610ebd826151af565b156111e35760a0840161271061ffff610ed5836151bc565b1610156111d45760c085019161271061ffff610ef0856151bc565b16101561119c5763ffffffff610f05866151cb565b16156111675767ffffffffffffffff1694858c52600a60205260408c20610f2b866151cb565b63ffffffff16908054906040840191610f43836151cb565b60201b67ffffffff0000000016936060860194610f5f866151cb565b60401b6bffffffff0000000000000000169660800196610f7e886151cb565b60601b6fffffffff0000000000000000000000001691610f9d8a6151bc565b60801b71ffff000000000000000000000000000000001693610fbe8c6151bc565b60901b73ffff00000000000000000000000000000000000016957fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016177fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16177fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff16177fffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff161717178155611071876151af565b81547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016179055604051966110c2906151dc565b63ffffffff1687526110d3906151dc565b63ffffffff1660208701526110e7906151dc565b63ffffffff1660408601526110fb906151dc565b63ffffffff16606085015261110f906148bf565b61ffff166080840152611121906148bf565b61ffff1660a083015261113390614890565b151560c082015260e07ffae1e296719dac5269c3886fb5002bb29bf17ae403060c6eb063a55abaaa104191a2600101610e26565b7f12332265000000000000000000000000000000000000000000000000000000008c5267ffffffffffffffff1660045260248bfd5b60248c61ffff6111ab866151bc565b7f95f3517a00000000000000000000000000000000000000000000000000000000835216600452fd5b8a61ffff6111ab6024936151bc565b7f12332265000000000000000000000000000000000000000000000000000000008a5267ffffffffffffffff16600452602489fd5b50346102ee5760806003193601126102ee576112326147c3565b5061123b614864565b6112436148ae565b5060643567ffffffffffffffff81116108c7579167ffffffffffffffff60409261127360e09536906004016148ce565b50508260c08551611283816146aa565b82815282602082015282878201528260608201528260808201528260a08201520152168152600a60205220604051906112bb826146aa565b5461ffff818163ffffffff82169485815263ffffffff60208201818560201c1681528160408401818760401c168152816060860193818960601c16855260ff60c060808901988a8c60801c168a528a60a082019c60901c168c52019b60a01c1615158b526040519b8c52511660208b0152511660408901525116606087015251166080850152511660a083015251151560c0820152f35b50346102ee5760406003193601126102ee5760043567ffffffffffffffff8111610902576113849036906004016149c0565b9061138d614809565b611395615592565b835b8381106113a2578480f35b80602073ffffffffffffffffffffffffffffffffffffffff6113cf6113ca602495898961518f565b614d4f565b16604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa80156114f15786906114bb575b6001925080611420575b5001611397565b61144e818573ffffffffffffffffffffffffffffffffffffffff6114486113ca878c8c61518f565b16615847565b73ffffffffffffffffffffffffffffffffffffffff6114716113ca84898961518f565b60405192835216907f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e602073ffffffffffffffffffffffffffffffffffffffff871692a338611419565b509060203d81116114ea575b6114d181836146e2565b602082600092810103126102ee5750906001915161140f565b503d6114c7565b6040513d88823e3d90fd5b50346102ee57806003193601126102ee57604051906005548083528260208101600584526020842092845b81811061160e57505061153c925003836146e2565b815161156061154a82614e0d565b9161155860405193846146e2565b808352614e0d565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b84518110156115bf578067ffffffffffffffff6115ac60019388615015565b51166115b88286615015565b520161158d565b50925090604051928392602084019060208552518091526040840192915b8181106115eb575050500390f35b825167ffffffffffffffff168452859450602093840193909201916001016115dd565b8454835260019485019487945060209093019201611527565b50346102ee5760206003193601126102ee5761166061164c61164761484d565b61516d565b604051918291602083526020830190614780565b0390f35b50346102ee5760606003193601126102ee576004359067ffffffffffffffff82116102ee578160040160a06003198436030112610902576116a361489d565b9060443567ffffffffffffffff8111610aa5576116c49036906004016148ce565b9390946116cf614ffc565b5060248101956116de87614d3a565b9067ffffffffffffffff604051927f958021a70000000000000000000000000000000000000000000000000000000084521660048301526040602483015283604483015260208260648173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa918215611ef0578492611eb4575b5073ffffffffffffffffffffffffffffffffffffffff821615611e8c576117d2907f0000000000000000000000000000000000000000000000000000000000000000976117c2606486013580958b615847565b6117ca614ffc565b5036916148fc565b60848301926117e084614d4f565b73ffffffffffffffffffffffffffffffffffffffff808a16911603611e425777ffffffffffffffff000000000000000000000000000000006118218a614d3a565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156114f1578691611e08575b50611de05767ffffffffffffffff6118b58a614d3a565b166118cd816000526006602052604060002054151590565b15611db557602073ffffffffffffffffffffffffffffffffffffffff60025416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa80156114f1578690611d64575b73ffffffffffffffffffffffffffffffffffffffff9150163303611d385761ffff8716918215611ca65761ffff60025460a01c168015611c7e57808410611c4e575067ffffffffffffffff6119828b614d3a565b1680875260036020527f61b04c91cb711a3783cc99d0de694ecd7ead5c96a0a87f5c89d436ac2097932885806119d58d73ffffffffffffffffffffffffffffffffffffffff60408d209116928391616116565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a25b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169283611b2c575b611b228a611abe6116478e611a518e8e615f8e565b937ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff611a8584614d3a565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685523360208601528401889052169180606081015b0390a2614d3a565b9060405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611afa6040826146e2565b60405192611b0784614643565b83526020830152604051928392604084526040840190614996565b9060208301520390f35b833b156108fa578787959493928c8793604051998a98899788967f5c3af7ca000000000000000000000000000000000000000000000000000000008852600488016060905280611b7b91615c11565b6064890160a09052610104890190611b9292614dad565b94611b9c9061487b565b67ffffffffffffffff166084880152604401611bb79061482c565b73ffffffffffffffffffffffffffffffffffffffff1660a487015260c4860152611be09061482c565b73ffffffffffffffffffffffffffffffffffffffff1660e48501526024840152828103600319016044840152611c1591614780565b03925af18015611c4357611c2e575b8080808080611a3c565b611c398280926146e2565b6102ee5780611c24565b6040513d84823e3d90fd5b86604491857f7911d95b000000000000000000000000000000000000000000000000000000008352600452602452fd5b6004877f98d50fd7000000000000000000000000000000000000000000000000000000008152fd5b67ffffffffffffffff611cb88b614d3a565b1680875260076020527fff0133389f9bb82d5b9385826160eaf2328039f6fa950eeb8cf0836da81789448580611d0b8d73ffffffffffffffffffffffffffffffffffffffff60408d209116928391616116565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a26119fe565b6024857f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b506020813d602011611dad575b81611d7e602093836146e2565b81010312611da957611da473ffffffffffffffffffffffffffffffffffffffff91614d0c565b61192e565b8580fd5b3d9150611d71565b7fa9902c7e000000000000000000000000000000000000000000000000000000008652600452602485fd5b6004857f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b90506020813d602011611e3a575b81611e23602093836146e2565b81010312611da957611e3490614d2d565b3861189e565b3d9150611e16565b60248573ffffffffffffffffffffffffffffffffffffffff611e6387614d4f565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b6004847f7af97002000000000000000000000000000000000000000000000000000000008152fd5b9091506020813d602011611ee8575b81611ed0602093836146e2565b81010312610aa557611ee190614d0c565b903861176f565b3d9150611ec3565b6040513d86823e3d90fd5b50346102ee57611f0a36614951565b611f12615592565b67ffffffffffffffff831692611f35846000526006602052604060002054151590565b15611fe5578385526007602052611f6460056040872001611f573685876148fc565b6020815191012090615e5a565b15611faa5750907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611fa4604051928392602084526020840191614dad565b0390a280f35b90611fe1906040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501614dec565b0390fd5b602485857f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b50346102ee5760206003193601126102ee5767ffffffffffffffff61203461484d565b168152600760205261204b60056040832001615c61565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061209061207a83614e0d565b9261208860405194856146e2565b808452614e0d565b01835b818110612167575050825b82518110156120e457806120b460019285615015565b51855260086020526120c8604086206150ab565b6120d28285615015565b526120dd8184615015565b500161209e565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b82821061211c57505050500390f35b91936020612157827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186528851614780565b960192019201859493919261210d565b806060602080938601015201612093565b50346102ee5760206003193601126102ee5767ffffffffffffffff61219b61484d565b6121a3615592565b16808252600b6020526040822090604051916121be83614643565b600181549182855201549060208401918252156122195760207f8a8e4c676433747219d2fee4ea128776522bb0177478e1e0a375e880948ed37b91838652600b8252856001604082208281550155519351604051908152a380f35b602484837fa28cbf38000000000000000000000000000000000000000000000000000000008252600452fd5b50346102ee5760206003193601126102ee5760043567ffffffffffffffff8111610902578060040160a060031983360301126108c757612283614ffc565b5060405160209261229484836146e2565b848252608481016122a481614d4f565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603612b6057602482019377ffffffffffffffff0000000000000000000000000000000061230a86614d3a565b60801b16604051907f2cbc26bb0000000000000000000000000000000000000000000000000000000082526004820152868160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115612acd578891612b2b575b50612b035767ffffffffffffffff61239d86614d3a565b166123b5816000526006602052604060002054151590565b15612ad8578673ffffffffffffffffffffffffffffffffffffffff60025416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa8015612acd578890612a81575b73ffffffffffffffffffffffffffffffffffffffff9150163303612a555786606484013594859367ffffffffffffffff61244e89614d3a565b1680845260078a5261249c6040852073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a91616116565b6040805173ffffffffffffffffffffffffffffffffffffffff8a168152602081018890527fff0133389f9bb82d5b9385826160eaf2328039f6fa950eeb8cf0836da81789449190a273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081612943575b5050505067ffffffffffffffff61253886614d3a565b168752600b86526040872060405161254f81614643565b600182549283835201549188820192835215612905577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8116156128fd57905b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169273ffffffffffffffffffffffffffffffffffffffff815193604051947f6e48b60d000000000000000000000000000000000000000000000000000000008652600486015216928360248201528a81604481885afa9081156128f2578c916128c5575b5061264b6116478b614d3a565b8b815191818082019384920101031261284a575190818103612897575050896126748680614cbb565b90500361284f57604490519601958961269661268f89614d4f565b9680614cbb565b908092918101031261284a5760409460c4938d923590519073ffffffffffffffffffffffffffffffffffffffff8851998a9889977f793ea55b00000000000000000000000000000000000000000000000000000000895260048901526024880152166044860152606485015288608485015260a48401525af196871561283e5780976127dd575b5050917ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff8593611ab66116479661276861276261279f9a614d3a565b93614d4f565b60405194859416968473ffffffffffffffffffffffffffffffffffffffff6040929594938160608401971683521660208201520152565b9160405190828201528181526127b66040826146e2565b604051926127c384614643565b835281830152611660604051928284938452830190614996565b909196506040823d604011612836575b816127fa604093836146e2565b810103126102ee5750840151947ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff61271d565b3d91506127ed565b604051903d90823e3d90fd5b600080fd5b611fe18a61285d8780614cbb565b92906040519384937fa3c8cf0900000000000000000000000000000000000000000000000000000000855260048501526024840191614dad565b7f81d8236e000000000000000000000000000000000000000000000000000000008d5260045260245260448bfd5b90508a81813d83116128eb575b6128dc81836146e2565b8101031261284a57513861263e565b503d6128d2565b6040513d8e823e3d90fd5b5085906125a4565b60248967ffffffffffffffff61291a8a614d3a565b7fa28cbf3800000000000000000000000000000000000000000000000000000000835216600452fd5b813b15610aa55783918991836040518096819582947f5c3af7ca00000000000000000000000000000000000000000000000000000000845260048401606090528d61298e8d80615c11565b6064870160a090526101048701906129a592614dad565b926129af9061487b565b67ffffffffffffffff1660848601526044016129ca9061482c565b73ffffffffffffffffffffffffffffffffffffffff1660a48501528c60c48501526129f49061482c565b73ffffffffffffffffffffffffffffffffffffffff1660e4840152836024840152828103600319016044840152612a2a91614780565b03925af18015611c4357612a40575b8080612522565b81612a4a916146e2565b6108fa578638612a39565b6024877f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b508681813d8311612ac6575b612a9781836146e2565b81010312612ac257612abd73ffffffffffffffffffffffffffffffffffffffff91614d0c565b612415565b8780fd5b503d612a8d565b6040513d8a823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008852600452602487fd5b6004877f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b90508681813d8311612b59575b612b4281836146e2565b81010312612ac257612b5390614d2d565b38612386565b503d612b38565b8573ffffffffffffffffffffffffffffffffffffffff611e63602493614d4f565b50346102ee57806003193601126102ee57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102ee5760c06003193601126102ee57612bcf6147c3565b612bd7614864565b9060643561ffff81168103610aa55760843567ffffffffffffffff81116108fe57612c069036906004016148ce565b9160a4359360028510156108fa57612c219560443591614e25565b90604051918291602083016020845282518091526020604085019301915b818110612c4d575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101612c3f565b50346102ee5760206003193601126102ee576020612cb867ffffffffffffffff612ca461484d565b166000526006602052604060002054151590565b6040519015158152f35b50346102ee57806003193601126102ee57805473ffffffffffffffffffffffffffffffffffffffff81163303612d61577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b50346102ee57806003193601126102ee576002546009546040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015290f35b50346102ee57806003193601126102ee57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102ee57612e2a36614951565b612e3693929193615592565b67ffffffffffffffff8216612e58816000526006602052604060002054151590565b15612e775750612e749293612e6e9136916148fc565b906155dd565b80f35b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b50346102ee5760606003193601126102ee57612ebc61484d565b6024359060443567ffffffffffffffff8111610aa557612ee09036906004016148ce565b612ee8615592565b67ffffffffffffffff831692612f0b846000526006602052604060002054151590565b15613002578415612fda57612f2a612f243684866148fc565b82614d70565b15611faa575060208103612f9d57816020918101031261284a5760207f83eda38165c92f401f97217d5ead82ef163d0b716c3979eff4670361bc2dc0c99135604051612f7581614643565b8181526001838201878152868952600b8552604089209251835551910155604051908152a380f35b611fe16040519283927f5552d631000000000000000000000000000000000000000000000000000000008452602060048501526024840191614dad565b6004867f5a39e303000000000000000000000000000000000000000000000000000000008152fd5b602486857f2e59db3a000000000000000000000000000000000000000000000000000000008252600452fd5b50346102ee5760206003193601126102ee5760043561ffff8116908181036108c7577fa7f8dbba8cdb126ce4a0e7939ec58e0161b70d808b585dd651d68e59d27e11fb9160209161307d615592565b7fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff75ffff00000000000000000000000000000000000000006002549260a01b16911617600255604051908152a180f35b50346102ee5760406003193601126102ee576130e761484d565b906024359067ffffffffffffffff82116102ee576020612cb88461310e3660048701614933565b90614d70565b50346102ee5760406003193601126102ee576004359067ffffffffffffffff82116102ee578160040161010060031984360301126109025761315461489d565b91806040516131628161468e565b5260648401359260c4850161319261318c6131876131808488614cbb565b36916148fc565b615391565b86615485565b9460848701906131a182614d4f565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116036138bf57602488019577ffffffffffffffff0000000000000000000000000000000061320788614d3a565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115613827578791613885575b5061385d5767ffffffffffffffff61329b88614d3a565b166132b3816000526006602052604060002054151590565b1561383257602073ffffffffffffffffffffffffffffffffffffffff60025416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156138275787916137ed575b50156137c15761332a87614d3a565b9461334060a48b019661310e6131808986614cbb565b1561377a5761ffff169081156136c65767ffffffffffffffff61336289614d3a565b1680885260046020527f0ca6b6e55c811717f7cba5bdd97184f0a2d5aa61e5ea64818392da5cef6ce6158a806133d460408c2073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016928391616116565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a25b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001694856134f7575b60208a60448d017ffc5e3a5bddc11d92c2dc20fae6f7d5eb989f056be35239f7de7e86150609abc067ffffffffffffffff6134826127628f61347c86614d4f565b50614d3a565b604080517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081168252336020830152909216908201526060810185905292169180608081015b0390a2806040516134ee8161468e565b52604051908152f35b853b15612ac25792889694928b8997959388946040519a8b998a9889977f5eff3bf700000000000000000000000000000000000000000000000000000000895260048901606090526135498680615c11565b60648b0161010090526101648b019061356192614dad565b9361356b9061487b565b67ffffffffffffffff1660848a01526135866044880161482c565b73ffffffffffffffffffffffffffffffffffffffff1660a48a015260c48901526135af9061482c565b73ffffffffffffffffffffffffffffffffffffffff1660e48801526135d49084615c11565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c888403016101048901526136099291614dad565b906136149083615c11565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c878403016101248801526136499291614dad565b9160e40161365691615c11565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8584030161014486015261368b9291614dad565b908b6024840152604483015203925af18015611c43576136b1575b80808080808061343b565b6136bc8280926146e2565b6102ee57806136a6565b67ffffffffffffffff6136d889614d3a565b1680885260076020527f50f6fbee3ceedce6b7fd7eaef18244487867e6718aec7208187efb6b7908c14c8a8061374d600260408d200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016928391616116565b6040805173ffffffffffffffffffffffffffffffffffffffff9290921682526020820192909252a26133fd565b6137848683614cbb565b611fe16040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191614dad565b6024867f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b90506020813d60201161381f575b81613808602093836146e2565b810103126108fa5761381990614d2d565b3861331b565b3d91506137fb565b6040513d89823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008752600452602486fd5b6004867f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b90506020813d6020116138b7575b816138a0602093836146e2565b810103126108fa576138b190614d2d565b38613284565b3d9150613893565b60248573ffffffffffffffffffffffffffffffffffffffff611e6385614d4f565b50346102ee5760206003193601126102ee5760043567ffffffffffffffff811161090257806004019161010060031983360301126102ee57806040516139258161468e565b52606482013590608483019361393a85614d4f565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116036141e857602484019177ffffffffffffffff000000000000000000000000000000006139a084614d3a565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c435782916141ae575b506141865767ffffffffffffffff613a3484614d3a565b16613a4c816000526006602052604060002054151590565b1561415a57602073ffffffffffffffffffffffffffffffffffffffff60025416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa908115611c43578291614120575b50156140f457613ac383614d3a565b613ad860a487019161310e6131808487614cbb565b156140ea5784959667ffffffffffffffff613af286614d3a565b168084526007602052613b446002604086200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016988991616116565b6040805173ffffffffffffffffffffffffffffffffffffffff89168152602081018a90527f50f6fbee3ceedce6b7fd7eaef18244487867e6718aec7208187efb6b7908c14c9190a273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081613f24575b50505090613bdb60e4870182614cbb565b81929101604083820312610aa557823567ffffffffffffffff81116108fe5781613c06918501614933565b9260208101359067ffffffffffffffff8211611da957613c27929101614933565b6040517fd5438eae00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115613f1957908592918391613eb7575b50613cfa8373ffffffffffffffffffffffffffffffffffffffff613d0c97604051988996879586937fa6208506000000000000000000000000000000000000000000000000000000008552604060048601526044850190614780565b90600319848303016024850152614780565b0393165af18015613eac5783928491613e1d575b5015613df557613d3660209160c4890190614cbb565b908092918101031261284a573503613dcd575067ffffffffffffffff6020946134de85613d8f6044613d887ffc5e3a5bddc11d92c2dc20fae6f7d5eb989f056be35239f7de7e86150609abc097614d3a565b9401614d4f565b6040805173ffffffffffffffffffffffffffffffffffffffff9889168152336020820152979091169087015260608601529116929081906080820190565b807f3f4d60530000000000000000000000000000000000000000000000000000000060049252fd5b6004837f2532cf45000000000000000000000000000000000000000000000000000000008152fd5b9250503d8084843e613e2f81846146e2565b8201606083820312610aa557825190613e4a60208501614d2d565b9360408101519067ffffffffffffffff82116108fa570181601f82011215611da957805191613e7883614723565b90613e8660405192836146e2565b838252602084840101116108fa5790602080613ea5949301910161475d565b9138613d20565b6040513d85823e3d90fd5b9193949250506020813d602011613f11575b81613ed6602093836146e2565b810103126108fe57918491613cfa8373ffffffffffffffffffffffffffffffffffffffff613f07613d0c9897614d0c565b9397505050613c9e565b3d9150613ec9565b6040513d87823e3d90fd5b813b15610aa5579183918693838a8c604051978896879586947f5eff3bf70000000000000000000000000000000000000000000000000000000086528d600487016060905280613f7391615c11565b606488016101009052610164880190613f8b92614dad565b93613f959061487b565b67ffffffffffffffff166084870152613fb06044860161482c565b73ffffffffffffffffffffffffffffffffffffffff1660a487015260c4860152613fd99061482c565b73ffffffffffffffffffffffffffffffffffffffff1660e4850152613ffe908c615c11565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c858403016101048601526140339291614dad565b61404060c483018c615c11565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c858403016101248601526140759291614dad565b9060e401614083908b615c11565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c848403016101448501526140b89291614dad565b8c602483015282604483015203925af18015611c43576140da575b8080613bca565b816140e4916146e2565b386140d3565b6137849083614cbb565b807f728fe07b000000000000000000000000000000000000000000000000000000006024925233600452fd5b90506020813d602011614152575b8161413b602093836146e2565b810103126109025761414c90614d2d565b38613ab4565b3d915061412e565b602492507fa9902c7e000000000000000000000000000000000000000000000000000000008252600452fd5b807f53ad11d80000000000000000000000000000000000000000000000000000000060049252fd5b90506020813d6020116141e0575b816141c9602093836146e2565b81010312610902576141da90614d2d565b38613a1d565b3d91506141bc565b60248273ffffffffffffffffffffffffffffffffffffffff611e6388614d4f565b50346102ee5760206003193601126102ee576040809167ffffffffffffffff61423061484d565b826020855161423e81614643565b8281520152168152600b60205220815161425781614643565b60206001835493848452015491019081528251918252516020820152f35b50346102ee5760c06003193601126102ee5761428f6147c3565b50614298614864565b6142a06147e6565b506084359161ffff831683036102ee5760a4359067ffffffffffffffff82116102ee5760a063ffffffff8061ffff6142e788886142e03660048b016148ce565b5050614b36565b95926040979194975197885216602087015216604085015216606083015215156080820152f35b50346102ee57806003193601126102ee57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102ee5760406003193601126102ee5761436661484d565b6024359182151583036102ee576101406144296143838585614ab3565b6143d960409392935180946fffffffffffffffffffffffffffffffff6080809282815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b60a08301906fffffffffffffffffffffffffffffffff6080809282815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565bf35b50346102ee5760206003193601126102ee576020906144486147c3565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b50346102ee57806003193601126102ee57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102ee57806003193601126102ee57506116606040516145036040826146e2565b601a81527f4c6f6d62617264546f6b656e506f6f6c20312e372e302d6465760000000000006020820152604051918291602083526020830190614780565b905034610902576020600319360112610902576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036108c757602092507faff2afbf000000000000000000000000000000000000000000000000000000008114908115614619575b81156145ef575b81156145c5575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386145be565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506145b7565b7f3317103100000000000000000000000000000000000000000000000000000000811491506145b0565b6040810190811067ffffffffffffffff82111761465f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6020810190811067ffffffffffffffff82111761465f57604052565b60e0810190811067ffffffffffffffff82111761465f57604052565b60a0810190811067ffffffffffffffff82111761465f57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761465f57604052565b67ffffffffffffffff811161465f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106147705750506000910152565b8181015183820152602001614760565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936147bc8151809281875287808801910161475d565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361284a57565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361284a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361284a57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361284a57565b6004359067ffffffffffffffff8216820361284a57565b6024359067ffffffffffffffff8216820361284a57565b359067ffffffffffffffff8216820361284a57565b3590811515820361284a57565b6024359061ffff8216820361284a57565b6044359061ffff8216820361284a57565b359061ffff8216820361284a57565b9181601f8401121561284a5782359167ffffffffffffffff831161284a576020838186019501011161284a57565b92919261490882614723565b9161491660405193846146e2565b82948184528183011161284a578281602093846000960137010152565b9080601f8301121561284a5781602061494e933591016148fc565b90565b90604060031983011261284a5760043567ffffffffffffffff8116810361284a57916024359067ffffffffffffffff821161284a57614992916004016148ce565b9091565b61494e9160206149af8351604084526040840190614780565b920151906020818403910152614780565b9181601f8401121561284a5782359167ffffffffffffffff831161284a576020808501948460051b01011161284a57565b9181601f8401121561284a5782359167ffffffffffffffff831161284a576020808501948460081b01011161284a57565b60405190614a2f826146c6565b60006080838281528260208201528260408201528260608201520152565b90604051614a5a816146c6565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff91614ac5614a22565b50614ace614a22565b50614b025716600052600760205260406000209061494e614af66002614afb614af686614a4d565b61530c565b9401614a4d565b1690816000526003602052614b1d614af66040600020614a4d565b91600052600460205261494e614af66040600020614a4d565b9061ffff8060025460a01c1691169283151592838094614cb3575b614c895767ffffffffffffffff16600052600a60205260406000209160405192614b7a846146aa565b5463ffffffff81168452602084019563ffffffff8260201c168752604085019263ffffffff8360401c168452606086019163ffffffff8460601c168352608087019761ffff8560801c16895260ff60a089019561ffff8160901c16875260a01c1615801560c08a0152614c6e57614c0f575050505063ffffffff808061ffff9351169451169551169351169193929190600190565b819397508092945010614c3e57505063ffffffff808061ffff9351169451169551169351169193929190600190565b7f7911d95b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b50505050505092505050600090600090600090600090600090565b7f98d50fd70000000000000000000000000000000000000000000000000000000060005260046000fd5b508215614b51565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561284a570180359067ffffffffffffffff821161284a5760200191813603831361284a57565b519073ffffffffffffffffffffffffffffffffffffffff8216820361284a57565b5190811515820361284a57565b3567ffffffffffffffff8116810361284a5790565b3573ffffffffffffffffffffffffffffffffffffffff8116810361284a5790565b9067ffffffffffffffff61494e92166000526007602052600560406000200190602081519101209060019160005201602052604060002054151590565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60409067ffffffffffffffff61494e95931681528160208201520191614dad565b67ffffffffffffffff811161465f5760051b60200190565b95939192949073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016958615614fda57614ede9467ffffffffffffffff61ffff9373ffffffffffffffffffffffffffffffffffffffff6040519b7f89720a62000000000000000000000000000000000000000000000000000000008d521660048c01521660248a0152604489015216606487015260c0608487015260c4860191614dad565b916002821015614fab578380600094819460a483015203915afa908115614f9f57600091614f0a575090565b3d8083833e614f1981836146e2565b8101906020818303126108c75780519067ffffffffffffffff8211610aa5570181601f820112156108c757805190614f5082614e0d565b93614f5e60405195866146e2565b82855260208086019360051b8301019384116102ee5750602001905b828210614f875750505090565b60208091614f9484614d0c565b815201910190614f7a565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b5050505050505050604051614ff06020826146e2565b60008152600036813790565b6040519061500982614643565b60606020838281520152565b80518210156150295760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600182811c921680156150a1575b602083101461507257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691615067565b90604051918260008254926150bf84615058565b808452936001811690811561512d57506001146150e6575b506150e4925003836146e2565b565b90506000929192526020600020906000915b8183106151115750509060206150e492820101386150d7565b60209193508060019154838589010152019101909184926150f8565b602093506150e49592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386150d7565b67ffffffffffffffff16600052600760205261494e60046040600020016150ab565b91908110156150295760051b0190565b91908110156150295760081b0190565b35801515810361284a5790565b3561ffff8116810361284a5790565b3563ffffffff8116810361284a5790565b359063ffffffff8216820361284a57565b35906fffffffffffffffffffffffffffffffff8216820361284a57565b919082606091031261284a576040516060810181811067ffffffffffffffff82111761465f57604052604061525d81839561524481614890565b8552615252602082016151ed565b6020860152016151ed565b910152565b6fffffffffffffffffffffffffffffffff6152a06040809361528381614890565b1515865283615294602083016151ed565b166020870152016151ed565b16910152565b8181106152b1575050565b600081556001016152a6565b818102929181159184041417156152d057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116152d057565b615314614a22565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff8083511691615371602085019361536b61535e63ffffffff875116426152ff565b85608089015116906152bd565b90615c04565b8082101561538a57505b16825263ffffffff4216905290565b905061537b565b80518015615401576020036153c357805160208281019183018390031261284a57519060ff82116153c3575060ff1690565b611fe1906040519182917f953576f7000000000000000000000000000000000000000000000000000000008352602060048401526024830190614780565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff82116152d057565b60ff16604d81116152d057600a0a90565b8115615456570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff81169282841461558b5782841161556157906154ca91615427565b91604d60ff8416118015615528575b6154f2575050906154ec61494e9261543b565b906152bd565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b506155328361543b565b8015615456577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0484116154d9565b61556a91615427565b91604d60ff8416116154f25750509061558561494e9261543b565b9061544c565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff6001541633036155b357565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b9080511561581d5767ffffffffffffffff815160208301209216918260005260076020526156128160056040600020016160c1565b156157d95760005260086020526040600020815167ffffffffffffffff811161465f5761563f8254615058565b601f81116157a7575b506020601f82116001146156e157916156bb827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea95936156d1956000916156d6575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9055604051918291602083526020830190614780565b0390a2565b90508401513861568a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b81811061578f5750926156d19492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610615758575b5050811b01905561164c565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388061574c565b9192602060018192868a015181550194019201615711565b6157d390836000526020600020601f840160051c8101916020851061083157601f0160051c01906152a6565b38615648565b5090611fe16040519283927f393b8ad20000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190614780565b7f14c880ca0000000000000000000000000000000000000000000000000000000060005260046000fd5b6040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff938416602483015260448083019590955293815261591d9290916158ac6064846146e2565b166000806040958651946158c088876146e2565b602086527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020870152519082855af13d156159cc573d9161590183614723565b9261590e875194856146e2565b83523d6000602085013e6163d2565b80518061592957505050565b816020918101031261284a5760206159419101614d2d565b156159495750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060916163d2565b815191929115615b56576fffffffffffffffffffffffffffffffff6040840151166fffffffffffffffffffffffffffffffff60208501511610615af3576150e491925b805182547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff0000000000000000000000000000000000000000161782556020810151825460409290920151608090811b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9290921691821760018501557fffffffffffffffffffffffff0000000000000000000000000000000000000000909216174290911b73ffffffff0000000000000000000000000000000016179055565b606483615b54604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b6fffffffffffffffffffffffffffffffff60408401511615801590615be5575b615b84576150e49192615a17565b606483615b54604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020840151161515615b76565b919082018092116152d057565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561284a57016020813591019167ffffffffffffffff821161284a57813603831361284a57565b906040519182815491828252602082019060005260206000209260005b818110615c935750506150e4925003836146e2565b8454835260019485019487945060209093019201615c7e565b80548210156150295760005260206000200190600090565b6000818152600660205260409020548015615e53577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116152d057600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116152d057818103615de4575b5050506005548015615db5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01615d72816005615cac565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b615e3b615df5615e06936005615cac565b90549060031b1c9283926005615cac565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526006602052604060002055388080615d39565b5050600090565b9060018201918160005282602052604060002054801515600014615f85577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116152d0578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116152d057818103615f4e575b50505080548015615db5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190615f0f8282615cac565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b615f6e615f5e615e069386615cac565b90549060031b1c92839286615cac565b905560005283602052604060002055388080615ed7565b50505050600090565b9061ffff9067ffffffffffffffff615fa860208501614d3a565b16600052600a60205260406000208260405191615fc4836146aa565b549263ffffffff8416835263ffffffff8460201c16602084015263ffffffff8460401c16604084015263ffffffff8460601c166060840152818460801c169283608082015260c060ff848760901c16968760a085015260a01c16151591015216151560001461605a57505b1680156160525761271061604b606061494e94013592836152bd565b04906152ff565b506060013590565b905061602f565b806000526006602052604060002054156000146160bb576005546801000000000000000081101561465f576160a2615e068260018594016005556005615cac565b9055600554906000526006602052604060002055600190565b50600090565b6000828152600182016020526040902054615e53578054906801000000000000000082101561465f57826160ff615e06846001809601855584615cac565b905580549260005201602052604060002055600190565b9182549060ff8260a01c161580156163ca575b6163c4576fffffffffffffffffffffffffffffffff8216916001850190815461616e63ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426152ff565b9081616326575b50508481106162da57508383106161cf5750506161a46fffffffffffffffffffffffffffffffff9283926152ff565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b9190915460801c92831561626e57816161e7916152ff565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116152d05761623561623a9273ffffffffffffffffffffffffffffffffffffffff96615c04565b61544c565b7fd0c8d23a000000000000000000000000000000000000000000000000000000006000526004526024521660445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff83837fd0c8d23a000000000000000000000000000000000000000000000000000000006000527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6004526024521660445260646000fd5b828573ffffffffffffffffffffffffffffffffffffffff927f1a76572a000000000000000000000000000000000000000000000000000000006000526004526024521660445260646000fd5b82869293961161639a576163419261536b9160801c906152bd565b808410156163955750825b85547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178655923880616175565b61634c565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b508215616129565b9192901561644d57508151156163e6575090565b3b156163ef5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156164605750805190602001fd5b611fe1906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260206004840152602483019061478056fea164736f6c634300081a000a", } var LombardTokenPoolABI = LombardTokenPoolMetaData.ABI var LombardTokenPoolBin = LombardTokenPoolMetaData.Bin -func DeployLombardTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, verifier common.Address, advancedPoolHooks common.Address, rmnProxy common.Address, router common.Address, fallbackDecimals uint8) (common.Address, *types.Transaction, *LombardTokenPool, error) { +func DeployLombardTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, verifier common.Address, bridge common.Address, adapter common.Address, advancedPoolHooks common.Address, rmnProxy common.Address, router common.Address, fallbackDecimals uint8) (common.Address, *types.Transaction, *LombardTokenPool, error) { parsed, err := LombardTokenPoolMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -118,7 +123,7 @@ func DeployLombardTokenPool(auth *bind.TransactOpts, backend bind.ContractBacken return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LombardTokenPoolBin), backend, token, verifier, advancedPoolHooks, rmnProxy, router, fallbackDecimals) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LombardTokenPoolBin), backend, token, verifier, bridge, adapter, advancedPoolHooks, rmnProxy, router, fallbackDecimals) if err != nil { return common.Address{}, nil, nil, err } @@ -334,6 +339,37 @@ func (_LombardTokenPool *LombardTokenPoolCallerSession) GetFee(arg0 common.Addre return _LombardTokenPool.Contract.GetFee(&_LombardTokenPool.CallOpts, arg0, destChainSelector, arg2, arg3, blockConfirmationRequested, arg5) } +func (_LombardTokenPool *LombardTokenPoolCaller) GetLombardConfig(opts *bind.CallOpts) (GetLombardConfig, + + error) { + var out []interface{} + err := _LombardTokenPool.contract.Call(opts, &out, "getLombardConfig") + + outstruct := new(GetLombardConfig) + if err != nil { + return *outstruct, err + } + + outstruct.VerifierResolver = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.Bridge = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.TokenAdapter = *abi.ConvertType(out[2], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +func (_LombardTokenPool *LombardTokenPoolSession) GetLombardConfig() (GetLombardConfig, + + error) { + return _LombardTokenPool.Contract.GetLombardConfig(&_LombardTokenPool.CallOpts) +} + +func (_LombardTokenPool *LombardTokenPoolCallerSession) GetLombardConfig() (GetLombardConfig, + + error) { + return _LombardTokenPool.Contract.GetLombardConfig(&_LombardTokenPool.CallOpts) +} + func (_LombardTokenPool *LombardTokenPoolCaller) GetMinBlockConfirmation(opts *bind.CallOpts) (uint16, error) { var out []interface{} err := _LombardTokenPool.contract.Call(opts, &out, "getMinBlockConfirmation") @@ -356,6 +392,28 @@ func (_LombardTokenPool *LombardTokenPoolCallerSession) GetMinBlockConfirmation( return _LombardTokenPool.Contract.GetMinBlockConfirmation(&_LombardTokenPool.CallOpts) } +func (_LombardTokenPool *LombardTokenPoolCaller) GetPath(opts *bind.CallOpts, remoteChainSelector uint64) (LombardTokenPoolPath, error) { + var out []interface{} + err := _LombardTokenPool.contract.Call(opts, &out, "getPath", remoteChainSelector) + + if err != nil { + return *new(LombardTokenPoolPath), err + } + + out0 := *abi.ConvertType(out[0], new(LombardTokenPoolPath)).(*LombardTokenPoolPath) + + return out0, err + +} + +func (_LombardTokenPool *LombardTokenPoolSession) GetPath(remoteChainSelector uint64) (LombardTokenPoolPath, error) { + return _LombardTokenPool.Contract.GetPath(&_LombardTokenPool.CallOpts, remoteChainSelector) +} + +func (_LombardTokenPool *LombardTokenPoolCallerSession) GetPath(remoteChainSelector uint64) (LombardTokenPoolPath, error) { + return _LombardTokenPool.Contract.GetPath(&_LombardTokenPool.CallOpts, remoteChainSelector) +} + func (_LombardTokenPool *LombardTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { var out []interface{} err := _LombardTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) @@ -532,9 +590,9 @@ func (_LombardTokenPool *LombardTokenPoolCallerSession) GetTokenTransferFeeConfi return _LombardTokenPool.Contract.GetTokenTransferFeeConfig(&_LombardTokenPool.CallOpts, arg0, destChainSelector, arg2, arg3) } -func (_LombardTokenPool *LombardTokenPoolCaller) GetVerifierResolver(opts *bind.CallOpts) (common.Address, error) { +func (_LombardTokenPool *LombardTokenPoolCaller) IBridge(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _LombardTokenPool.contract.Call(opts, &out, "getVerifierResolver") + err := _LombardTokenPool.contract.Call(opts, &out, "i_bridge") if err != nil { return *new(common.Address), err @@ -546,12 +604,12 @@ func (_LombardTokenPool *LombardTokenPoolCaller) GetVerifierResolver(opts *bind. } -func (_LombardTokenPool *LombardTokenPoolSession) GetVerifierResolver() (common.Address, error) { - return _LombardTokenPool.Contract.GetVerifierResolver(&_LombardTokenPool.CallOpts) +func (_LombardTokenPool *LombardTokenPoolSession) IBridge() (common.Address, error) { + return _LombardTokenPool.Contract.IBridge(&_LombardTokenPool.CallOpts) } -func (_LombardTokenPool *LombardTokenPoolCallerSession) GetVerifierResolver() (common.Address, error) { - return _LombardTokenPool.Contract.GetVerifierResolver(&_LombardTokenPool.CallOpts) +func (_LombardTokenPool *LombardTokenPoolCallerSession) IBridge() (common.Address, error) { + return _LombardTokenPool.Contract.IBridge(&_LombardTokenPool.CallOpts) } func (_LombardTokenPool *LombardTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { @@ -620,28 +678,6 @@ func (_LombardTokenPool *LombardTokenPoolCallerSession) IsSupportedToken(token c return _LombardTokenPool.Contract.IsSupportedToken(&_LombardTokenPool.CallOpts, token) } -func (_LombardTokenPool *LombardTokenPoolCaller) LockOrBurn(opts *bind.CallOpts, arg0 PoolLockOrBurnInV1) (PoolLockOrBurnOutV1, error) { - var out []interface{} - err := _LombardTokenPool.contract.Call(opts, &out, "lockOrBurn", arg0) - - if err != nil { - return *new(PoolLockOrBurnOutV1), err - } - - out0 := *abi.ConvertType(out[0], new(PoolLockOrBurnOutV1)).(*PoolLockOrBurnOutV1) - - return out0, err - -} - -func (_LombardTokenPool *LombardTokenPoolSession) LockOrBurn(arg0 PoolLockOrBurnInV1) (PoolLockOrBurnOutV1, error) { - return _LombardTokenPool.Contract.LockOrBurn(&_LombardTokenPool.CallOpts, arg0) -} - -func (_LombardTokenPool *LombardTokenPoolCallerSession) LockOrBurn(arg0 PoolLockOrBurnInV1) (PoolLockOrBurnOutV1, error) { - return _LombardTokenPool.Contract.LockOrBurn(&_LombardTokenPool.CallOpts, arg0) -} - func (_LombardTokenPool *LombardTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _LombardTokenPool.contract.Call(opts, &out, "owner") @@ -664,28 +700,6 @@ func (_LombardTokenPool *LombardTokenPoolCallerSession) Owner() (common.Address, return _LombardTokenPool.Contract.Owner(&_LombardTokenPool.CallOpts) } -func (_LombardTokenPool *LombardTokenPoolCaller) ReleaseOrMint(opts *bind.CallOpts, arg0 PoolReleaseOrMintInV1) (PoolReleaseOrMintOutV1, error) { - var out []interface{} - err := _LombardTokenPool.contract.Call(opts, &out, "releaseOrMint", arg0) - - if err != nil { - return *new(PoolReleaseOrMintOutV1), err - } - - out0 := *abi.ConvertType(out[0], new(PoolReleaseOrMintOutV1)).(*PoolReleaseOrMintOutV1) - - return out0, err - -} - -func (_LombardTokenPool *LombardTokenPoolSession) ReleaseOrMint(arg0 PoolReleaseOrMintInV1) (PoolReleaseOrMintOutV1, error) { - return _LombardTokenPool.Contract.ReleaseOrMint(&_LombardTokenPool.CallOpts, arg0) -} - -func (_LombardTokenPool *LombardTokenPoolCallerSession) ReleaseOrMint(arg0 PoolReleaseOrMintInV1) (PoolReleaseOrMintOutV1, error) { - return _LombardTokenPool.Contract.ReleaseOrMint(&_LombardTokenPool.CallOpts, arg0) -} - func (_LombardTokenPool *LombardTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { var out []interface{} err := _LombardTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) @@ -778,6 +792,18 @@ func (_LombardTokenPool *LombardTokenPoolTransactorSession) ApplyTokenTransferFe return _LombardTokenPool.Contract.ApplyTokenTransferFeeConfigUpdates(&_LombardTokenPool.TransactOpts, tokenTransferFeeConfigArgs, disableTokenTransferFeeConfigs) } +func (_LombardTokenPool *LombardTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _LombardTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_LombardTokenPool *LombardTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _LombardTokenPool.Contract.LockOrBurn(&_LombardTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_LombardTokenPool *LombardTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _LombardTokenPool.Contract.LockOrBurn(&_LombardTokenPool.TransactOpts, lockOrBurnIn) +} + func (_LombardTokenPool *LombardTokenPoolTransactor) LockOrBurn0(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1, blockConfirmationRequested uint16, tokenArgs []byte) (*types.Transaction, error) { return _LombardTokenPool.contract.Transact(opts, "lockOrBurn0", lockOrBurnIn, blockConfirmationRequested, tokenArgs) } @@ -790,6 +816,18 @@ func (_LombardTokenPool *LombardTokenPoolTransactorSession) LockOrBurn0(lockOrBu return _LombardTokenPool.Contract.LockOrBurn0(&_LombardTokenPool.TransactOpts, lockOrBurnIn, blockConfirmationRequested, tokenArgs) } +func (_LombardTokenPool *LombardTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _LombardTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_LombardTokenPool *LombardTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _LombardTokenPool.Contract.ReleaseOrMint(&_LombardTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_LombardTokenPool *LombardTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _LombardTokenPool.Contract.ReleaseOrMint(&_LombardTokenPool.TransactOpts, releaseOrMintIn) +} + func (_LombardTokenPool *LombardTokenPoolTransactor) ReleaseOrMint0(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1, blockConfirmationRequested uint16) (*types.Transaction, error) { return _LombardTokenPool.contract.Transact(opts, "releaseOrMint0", releaseOrMintIn, blockConfirmationRequested) } @@ -802,6 +840,18 @@ func (_LombardTokenPool *LombardTokenPoolTransactorSession) ReleaseOrMint0(relea return _LombardTokenPool.Contract.ReleaseOrMint0(&_LombardTokenPool.TransactOpts, releaseOrMintIn, blockConfirmationRequested) } +func (_LombardTokenPool *LombardTokenPoolTransactor) RemovePath(opts *bind.TransactOpts, remoteChainSelector uint64) (*types.Transaction, error) { + return _LombardTokenPool.contract.Transact(opts, "removePath", remoteChainSelector) +} + +func (_LombardTokenPool *LombardTokenPoolSession) RemovePath(remoteChainSelector uint64) (*types.Transaction, error) { + return _LombardTokenPool.Contract.RemovePath(&_LombardTokenPool.TransactOpts, remoteChainSelector) +} + +func (_LombardTokenPool *LombardTokenPoolTransactorSession) RemovePath(remoteChainSelector uint64) (*types.Transaction, error) { + return _LombardTokenPool.Contract.RemovePath(&_LombardTokenPool.TransactOpts, remoteChainSelector) +} + func (_LombardTokenPool *LombardTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { return _LombardTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) } @@ -838,6 +888,18 @@ func (_LombardTokenPool *LombardTokenPoolTransactorSession) SetMinBlockConfirmat return _LombardTokenPool.Contract.SetMinBlockConfirmation(&_LombardTokenPool.TransactOpts, minBlockConfirmation) } +func (_LombardTokenPool *LombardTokenPoolTransactor) SetPath(opts *bind.TransactOpts, remoteChainSelector uint64, lChainId [32]byte, allowedCaller []byte) (*types.Transaction, error) { + return _LombardTokenPool.contract.Transact(opts, "setPath", remoteChainSelector, lChainId, allowedCaller) +} + +func (_LombardTokenPool *LombardTokenPoolSession) SetPath(remoteChainSelector uint64, lChainId [32]byte, allowedCaller []byte) (*types.Transaction, error) { + return _LombardTokenPool.Contract.SetPath(&_LombardTokenPool.TransactOpts, remoteChainSelector, lChainId, allowedCaller) +} + +func (_LombardTokenPool *LombardTokenPoolTransactorSession) SetPath(remoteChainSelector uint64, lChainId [32]byte, allowedCaller []byte) (*types.Transaction, error) { + return _LombardTokenPool.Contract.SetPath(&_LombardTokenPool.TransactOpts, remoteChainSelector, lChainId, allowedCaller) +} + func (_LombardTokenPool *LombardTokenPoolTransactor) SetRateLimitConfig(opts *bind.TransactOpts, rateLimitConfigArgs []TokenPoolRateLimitConfigArgs) (*types.Transaction, error) { return _LombardTokenPool.contract.Transact(opts, "setRateLimitConfig", rateLimitConfigArgs) } @@ -1883,8 +1945,8 @@ func (_LombardTokenPool *LombardTokenPoolFilterer) ParseLockedOrBurned(log types return event, nil } -type LombardTokenPoolLombardVerifierSetIterator struct { - Event *LombardTokenPoolLombardVerifierSet +type LombardTokenPoolLombardConfigurationSetIterator struct { + Event *LombardTokenPoolLombardConfigurationSet contract *bind.BoundContract event string @@ -1895,7 +1957,7 @@ type LombardTokenPoolLombardVerifierSetIterator struct { fail error } -func (it *LombardTokenPoolLombardVerifierSetIterator) Next() bool { +func (it *LombardTokenPoolLombardConfigurationSetIterator) Next() bool { if it.fail != nil { return false @@ -1904,7 +1966,7 @@ func (it *LombardTokenPoolLombardVerifierSetIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(LombardTokenPoolLombardVerifierSet) + it.Event = new(LombardTokenPoolLombardConfigurationSet) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1919,7 +1981,7 @@ func (it *LombardTokenPoolLombardVerifierSetIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(LombardTokenPoolLombardVerifierSet) + it.Event = new(LombardTokenPoolLombardConfigurationSet) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1934,42 +1996,60 @@ func (it *LombardTokenPoolLombardVerifierSetIterator) Next() bool { } } -func (it *LombardTokenPoolLombardVerifierSetIterator) Error() error { +func (it *LombardTokenPoolLombardConfigurationSetIterator) Error() error { return it.fail } -func (it *LombardTokenPoolLombardVerifierSetIterator) Close() error { +func (it *LombardTokenPoolLombardConfigurationSetIterator) Close() error { it.sub.Unsubscribe() return nil } -type LombardTokenPoolLombardVerifierSet struct { - Verifier common.Address - Raw types.Log +type LombardTokenPoolLombardConfigurationSet struct { + Verifier common.Address + Bridge common.Address + TokenAdapter common.Address + Raw types.Log } -func (_LombardTokenPool *LombardTokenPoolFilterer) FilterLombardVerifierSet(opts *bind.FilterOpts, verifier []common.Address) (*LombardTokenPoolLombardVerifierSetIterator, error) { +func (_LombardTokenPool *LombardTokenPoolFilterer) FilterLombardConfigurationSet(opts *bind.FilterOpts, verifier []common.Address, bridge []common.Address, tokenAdapter []common.Address) (*LombardTokenPoolLombardConfigurationSetIterator, error) { var verifierRule []interface{} for _, verifierItem := range verifier { verifierRule = append(verifierRule, verifierItem) } + var bridgeRule []interface{} + for _, bridgeItem := range bridge { + bridgeRule = append(bridgeRule, bridgeItem) + } + var tokenAdapterRule []interface{} + for _, tokenAdapterItem := range tokenAdapter { + tokenAdapterRule = append(tokenAdapterRule, tokenAdapterItem) + } - logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "LombardVerifierSet", verifierRule) + logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "LombardConfigurationSet", verifierRule, bridgeRule, tokenAdapterRule) if err != nil { return nil, err } - return &LombardTokenPoolLombardVerifierSetIterator{contract: _LombardTokenPool.contract, event: "LombardVerifierSet", logs: logs, sub: sub}, nil + return &LombardTokenPoolLombardConfigurationSetIterator{contract: _LombardTokenPool.contract, event: "LombardConfigurationSet", logs: logs, sub: sub}, nil } -func (_LombardTokenPool *LombardTokenPoolFilterer) WatchLombardVerifierSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolLombardVerifierSet, verifier []common.Address) (event.Subscription, error) { +func (_LombardTokenPool *LombardTokenPoolFilterer) WatchLombardConfigurationSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolLombardConfigurationSet, verifier []common.Address, bridge []common.Address, tokenAdapter []common.Address) (event.Subscription, error) { var verifierRule []interface{} for _, verifierItem := range verifier { verifierRule = append(verifierRule, verifierItem) } + var bridgeRule []interface{} + for _, bridgeItem := range bridge { + bridgeRule = append(bridgeRule, bridgeItem) + } + var tokenAdapterRule []interface{} + for _, tokenAdapterItem := range tokenAdapter { + tokenAdapterRule = append(tokenAdapterRule, tokenAdapterItem) + } - logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "LombardVerifierSet", verifierRule) + logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "LombardConfigurationSet", verifierRule, bridgeRule, tokenAdapterRule) if err != nil { return nil, err } @@ -1979,8 +2059,8 @@ func (_LombardTokenPool *LombardTokenPoolFilterer) WatchLombardVerifierSet(opts select { case log := <-logs: - event := new(LombardTokenPoolLombardVerifierSet) - if err := _LombardTokenPool.contract.UnpackLog(event, "LombardVerifierSet", log); err != nil { + event := new(LombardTokenPoolLombardConfigurationSet) + if err := _LombardTokenPool.contract.UnpackLog(event, "LombardConfigurationSet", log); err != nil { return err } event.Raw = log @@ -2001,9 +2081,9 @@ func (_LombardTokenPool *LombardTokenPoolFilterer) WatchLombardVerifierSet(opts }), nil } -func (_LombardTokenPool *LombardTokenPoolFilterer) ParseLombardVerifierSet(log types.Log) (*LombardTokenPoolLombardVerifierSet, error) { - event := new(LombardTokenPoolLombardVerifierSet) - if err := _LombardTokenPool.contract.UnpackLog(event, "LombardVerifierSet", log); err != nil { +func (_LombardTokenPool *LombardTokenPoolFilterer) ParseLombardConfigurationSet(log types.Log) (*LombardTokenPoolLombardConfigurationSet, error) { + event := new(LombardTokenPoolLombardConfigurationSet) + if err := _LombardTokenPool.contract.UnpackLog(event, "LombardConfigurationSet", log); err != nil { return nil, err } event.Raw = log @@ -2528,6 +2608,280 @@ func (_LombardTokenPool *LombardTokenPoolFilterer) ParseOwnershipTransferred(log return event, nil } +type LombardTokenPoolPathRemovedIterator struct { + Event *LombardTokenPoolPathRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LombardTokenPoolPathRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LombardTokenPoolPathRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LombardTokenPoolPathRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LombardTokenPoolPathRemovedIterator) Error() error { + return it.fail +} + +func (it *LombardTokenPoolPathRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LombardTokenPoolPathRemoved struct { + RemoteChainSelector uint64 + LChainId [32]byte + AllowedCaller [32]byte + Raw types.Log +} + +func (_LombardTokenPool *LombardTokenPoolFilterer) FilterPathRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64, lChainId [][32]byte) (*LombardTokenPoolPathRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var lChainIdRule []interface{} + for _, lChainIdItem := range lChainId { + lChainIdRule = append(lChainIdRule, lChainIdItem) + } + + logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "PathRemoved", remoteChainSelectorRule, lChainIdRule) + if err != nil { + return nil, err + } + return &LombardTokenPoolPathRemovedIterator{contract: _LombardTokenPool.contract, event: "PathRemoved", logs: logs, sub: sub}, nil +} + +func (_LombardTokenPool *LombardTokenPoolFilterer) WatchPathRemoved(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolPathRemoved, remoteChainSelector []uint64, lChainId [][32]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var lChainIdRule []interface{} + for _, lChainIdItem := range lChainId { + lChainIdRule = append(lChainIdRule, lChainIdItem) + } + + logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "PathRemoved", remoteChainSelectorRule, lChainIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LombardTokenPoolPathRemoved) + if err := _LombardTokenPool.contract.UnpackLog(event, "PathRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LombardTokenPool *LombardTokenPoolFilterer) ParsePathRemoved(log types.Log) (*LombardTokenPoolPathRemoved, error) { + event := new(LombardTokenPoolPathRemoved) + if err := _LombardTokenPool.contract.UnpackLog(event, "PathRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LombardTokenPoolPathSetIterator struct { + Event *LombardTokenPoolPathSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LombardTokenPoolPathSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LombardTokenPoolPathSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LombardTokenPoolPathSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LombardTokenPoolPathSetIterator) Error() error { + return it.fail +} + +func (it *LombardTokenPoolPathSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LombardTokenPoolPathSet struct { + RemoteChainSelector uint64 + LChainId [32]byte + AllowedCaller [32]byte + Raw types.Log +} + +func (_LombardTokenPool *LombardTokenPoolFilterer) FilterPathSet(opts *bind.FilterOpts, remoteChainSelector []uint64, lChainId [][32]byte) (*LombardTokenPoolPathSetIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var lChainIdRule []interface{} + for _, lChainIdItem := range lChainId { + lChainIdRule = append(lChainIdRule, lChainIdItem) + } + + logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "PathSet", remoteChainSelectorRule, lChainIdRule) + if err != nil { + return nil, err + } + return &LombardTokenPoolPathSetIterator{contract: _LombardTokenPool.contract, event: "PathSet", logs: logs, sub: sub}, nil +} + +func (_LombardTokenPool *LombardTokenPoolFilterer) WatchPathSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolPathSet, remoteChainSelector []uint64, lChainId [][32]byte) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + var lChainIdRule []interface{} + for _, lChainIdItem := range lChainId { + lChainIdRule = append(lChainIdRule, lChainIdItem) + } + + logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "PathSet", remoteChainSelectorRule, lChainIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LombardTokenPoolPathSet) + if err := _LombardTokenPool.contract.UnpackLog(event, "PathSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LombardTokenPool *LombardTokenPoolFilterer) ParsePathSet(log types.Log) (*LombardTokenPoolPathSet, error) { + event := new(LombardTokenPoolPathSet) + if err := _LombardTokenPool.contract.UnpackLog(event, "PathSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type LombardTokenPoolRateLimitConfiguredIterator struct { Event *LombardTokenPoolRateLimitConfigured @@ -3315,6 +3669,11 @@ type GetFee struct { TokenFeeBps uint16 IsEnabled bool } +type GetLombardConfig struct { + VerifierResolver common.Address + Bridge common.Address + TokenAdapter common.Address +} func (LombardTokenPoolChainAdded) Topic() common.Hash { return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") @@ -3348,8 +3707,8 @@ func (LombardTokenPoolLockedOrBurned) Topic() common.Hash { return common.HexToHash("0xf33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae10") } -func (LombardTokenPoolLombardVerifierSet) Topic() common.Hash { - return common.HexToHash("0xa817b8930bcb4b25cbd026589d9815aceaf8ec0882ebf9bdf32f1e22f69ff745") +func (LombardTokenPoolLombardConfigurationSet) Topic() common.Hash { + return common.HexToHash("0x01d5dd7f15328f4241da3a1d9c7b310ae9ac14e8ca441203a7b6f71c7da0c49d") } func (LombardTokenPoolMinBlockConfirmationSet) Topic() common.Hash { @@ -3368,6 +3727,14 @@ func (LombardTokenPoolOwnershipTransferred) Topic() common.Hash { return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") } +func (LombardTokenPoolPathRemoved) Topic() common.Hash { + return common.HexToHash("0x8a8e4c676433747219d2fee4ea128776522bb0177478e1e0a375e880948ed37b") +} + +func (LombardTokenPoolPathSet) Topic() common.Hash { + return common.HexToHash("0x83eda38165c92f401f97217d5ead82ef163d0b716c3979eff4670361bc2dc0c9") +} + func (LombardTokenPoolRateLimitConfigured) Topic() common.Hash { return common.HexToHash("0x41f7c8f7cfdad9350aa495e6c54cbbf750a07ab38a9098aed1256e30dd1682bb") } @@ -3409,8 +3776,14 @@ type LombardTokenPoolInterface interface { error) + GetLombardConfig(opts *bind.CallOpts) (GetLombardConfig, + + error) + GetMinBlockConfirmation(opts *bind.CallOpts) (uint16, error) + GetPath(opts *bind.CallOpts, remoteChainSelector uint64) (LombardTokenPoolPath, error) + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) @@ -3427,7 +3800,7 @@ type LombardTokenPoolInterface interface { GetTokenTransferFeeConfig(opts *bind.CallOpts, arg0 common.Address, destChainSelector uint64, arg2 uint16, arg3 []byte) (IPoolV2TokenTransferFeeConfig, error) - GetVerifierResolver(opts *bind.CallOpts) (common.Address, error) + IBridge(opts *bind.CallOpts) (common.Address, error) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) @@ -3435,12 +3808,8 @@ type LombardTokenPoolInterface interface { IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) - LockOrBurn(opts *bind.CallOpts, arg0 PoolLockOrBurnInV1) (PoolLockOrBurnOutV1, error) - Owner(opts *bind.CallOpts) (common.Address, error) - ReleaseOrMint(opts *bind.CallOpts, arg0 PoolReleaseOrMintInV1) (PoolReleaseOrMintOutV1, error) - SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) TypeAndVersion(opts *bind.CallOpts) (string, error) @@ -3453,16 +3822,24 @@ type LombardTokenPoolInterface interface { ApplyTokenTransferFeeConfigUpdates(opts *bind.TransactOpts, tokenTransferFeeConfigArgs []TokenPoolTokenTransferFeeConfigArgs, disableTokenTransferFeeConfigs []uint64) (*types.Transaction, error) + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + LockOrBurn0(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1, blockConfirmationRequested uint16, tokenArgs []byte) (*types.Transaction, error) + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + ReleaseOrMint0(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1, blockConfirmationRequested uint16) (*types.Transaction, error) + RemovePath(opts *bind.TransactOpts, remoteChainSelector uint64) (*types.Transaction, error) + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) SetDynamicConfig(opts *bind.TransactOpts, router common.Address, rateLimitAdmin common.Address) (*types.Transaction, error) SetMinBlockConfirmation(opts *bind.TransactOpts, minBlockConfirmation uint16) (*types.Transaction, error) + SetPath(opts *bind.TransactOpts, remoteChainSelector uint64, lChainId [32]byte, allowedCaller []byte) (*types.Transaction, error) + SetRateLimitConfig(opts *bind.TransactOpts, rateLimitConfigArgs []TokenPoolRateLimitConfigArgs) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) @@ -3517,11 +3894,11 @@ type LombardTokenPoolInterface interface { ParseLockedOrBurned(log types.Log) (*LombardTokenPoolLockedOrBurned, error) - FilterLombardVerifierSet(opts *bind.FilterOpts, verifier []common.Address) (*LombardTokenPoolLombardVerifierSetIterator, error) + FilterLombardConfigurationSet(opts *bind.FilterOpts, verifier []common.Address, bridge []common.Address, tokenAdapter []common.Address) (*LombardTokenPoolLombardConfigurationSetIterator, error) - WatchLombardVerifierSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolLombardVerifierSet, verifier []common.Address) (event.Subscription, error) + WatchLombardConfigurationSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolLombardConfigurationSet, verifier []common.Address, bridge []common.Address, tokenAdapter []common.Address) (event.Subscription, error) - ParseLombardVerifierSet(log types.Log) (*LombardTokenPoolLombardVerifierSet, error) + ParseLombardConfigurationSet(log types.Log) (*LombardTokenPoolLombardConfigurationSet, error) FilterMinBlockConfirmationSet(opts *bind.FilterOpts) (*LombardTokenPoolMinBlockConfirmationSetIterator, error) @@ -3547,6 +3924,18 @@ type LombardTokenPoolInterface interface { ParseOwnershipTransferred(log types.Log) (*LombardTokenPoolOwnershipTransferred, error) + FilterPathRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64, lChainId [][32]byte) (*LombardTokenPoolPathRemovedIterator, error) + + WatchPathRemoved(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolPathRemoved, remoteChainSelector []uint64, lChainId [][32]byte) (event.Subscription, error) + + ParsePathRemoved(log types.Log) (*LombardTokenPoolPathRemoved, error) + + FilterPathSet(opts *bind.FilterOpts, remoteChainSelector []uint64, lChainId [][32]byte) (*LombardTokenPoolPathSetIterator, error) + + WatchPathSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolPathSet, remoteChainSelector []uint64, lChainId [][32]byte) (event.Subscription, error) + + ParsePathSet(log types.Log) (*LombardTokenPoolPathSet, error) + FilterRateLimitConfigured(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LombardTokenPoolRateLimitConfiguredIterator, error) WatchRateLimitConfigured(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRateLimitConfigured, remoteChainSelector []uint64) (event.Subscription, error) diff --git a/chains/evm/.gas-snapshot b/chains/evm/.gas-snapshot index 3577a3c7af..7cc5ccf2c4 100644 --- a/chains/evm/.gas-snapshot +++ b/chains/evm/.gas-snapshot @@ -262,11 +262,19 @@ LockReleaseTokenPool_releaseOrMint:test_releaseOrMintV2() (gas: 246087) LockReleaseTokenPool_setRebalancer:test_SetRebalancer() (gas: 21887) LockReleaseTokenPool_supportsInterface:test_SupportsInterface() (gas: 10100) LockReleaseTokenPool_transferLiquidity:test_transferLiquidity() (gas: 97430) -LombardTokenPool_constructor:test_constructor() (gas: 3997157) -LombardTokenPool_constructor:test_constructor_ZeroVerifierNotAllowed() (gas: 92061) -LombardTokenPool_getTokenDecimals:test_getTokenDecimals_FallsBackOnRevert() (gas: 12070) -LombardTokenPool_getTokenDecimals:test_getTokenDecimals_UsesTokenDecimals() (gas: 14385) -LombardTokenPool_lockOrBurn:test_lockOrBurn_ForwardsToVerifier() (gas: 247116) +LombardTokenPool_constructor:test_constructor() (gas: 4566065) +LombardTokenPool_constructor:test_constructor_RevertsWhen_InvalidBridgeVersion() (gas: 368410) +LombardTokenPool_constructor:test_constructor_RevertsWhen_ZeroBridge() (gas: 95359) +LombardTokenPool_constructor:test_constructor_ZeroVerifierNotAllowed() (gas: 98553) +LombardTokenPool_getTokenDecimals:test_getTokenDecimals_FallsBackOnRevert() (gas: 12048) +LombardTokenPool_getTokenDecimals:test_getTokenDecimals_UsesTokenDecimals() (gas: 14363) +LombardTokenPool_lockOrBurn:test_lockOrBurn_ForwardsToVerifier() (gas: 248886) +LombardTokenPool_lockOrBurn:test_lockOrBurn_V1() (gas: 317549) +LombardTokenPool_lockOrBurn:test_lockOrBurn_V1_UsesAdapterWhenConfigured() (gas: 5236650) +LombardTokenPool_lockOrBurn:test_lockOrBurn_V2_ForwardsToVerifier() (gas: 249113) +LombardTokenPool_releaseOrMint:test_releaseOrMint_V1() (gas: 492653) +LombardTokenPool_removePath:test_removePath_RemovesConfig() (gas: 54603) +LombardTokenPool_setPath:test_setPath() (gas: 69388) MessageV1Codec__decodeMessageV1:test__decodeMessageV1_EmptyFields() (gas: 46889) MessageV1Codec__decodeMessageV1:test__decodeMessageV1_MaxLengthFields() (gas: 436236) MessageV1Codec__decodeMessageV1:test__decodeMessageV1_WithData() (gas: 57857) diff --git a/chains/evm/contracts/pools/Lombard/LombardTokenPool.sol b/chains/evm/contracts/pools/Lombard/LombardTokenPool.sol index 0f431a6daf..0e217335ce 100644 --- a/chains/evm/contracts/pools/Lombard/LombardTokenPool.sol +++ b/chains/evm/contracts/pools/Lombard/LombardTokenPool.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.24; import {ICrossChainVerifierResolver} from "../../interfaces/ICrossChainVerifierResolver.sol"; +import {IBridgeV1} from "./interfaces/IBridgeV1.sol"; +import {IMailbox} from "./interfaces/IMailbox.sol"; import {ITypeAndVersion} from "@chainlink/contracts/src/v0.8/shared/interfaces/ITypeAndVersion.sol"; import {Pool} from "../../libraries/Pool.sol"; @@ -16,34 +18,87 @@ import {SafeERC20} from "@openzeppelin/contracts@4.8.3/token/ERC20/utils/SafeERC /// the pool performs validation, rate limiting, accounting and event emission. /// IPoolV2.lockOrBurn forwards tokens to the verifier. /// IPoolV2.releaseOrMint does not move tokens, _releaseOrMint is a no-op. -/// TODO: Add explicit V1 support/backwards compatibility. +/// IPoolV1.lockOrBurn and IPoolV1.releaseOrMint make this pool backwards compatible with old lanes. contract LombardTokenPool is TokenPool, ITypeAndVersion { using SafeERC20 for IERC20; using SafeERC20 for IERC20Metadata; error ZeroVerifierNotAllowed(); error OutboundImplementationNotFoundForVerifier(); + error ZeroBridge(); + error ZeroLombardChainId(); + error PathNotExist(uint64 remoteChainSelector); + error InvalidMessageVersion(uint8 expected, uint8 received); + error RemoteTokenMismatch(bytes32 bridge, bytes32 pool); + error InvalidReceiver(bytes receiver); + error ChainNotSupported(uint64 remoteChainSelector); + error InvalidAllowedCaller(bytes allowedCaller); + error ExecutionError(); + error HashMismatch(); - event LombardVerifierSet(address indexed verifier); + /// The following events are emitted for Lombard-specific configuration updates and are utilized by Lombard. + /// @param remoteChainSelector CCIP selector of destination chain. + /// @param lChainId The chain ID according to Lombard Multi Chain ID convention. + /// @param allowedCaller The address that's allowed to call the bridge on the destination chain. + event PathSet(uint64 indexed remoteChainSelector, bytes32 indexed lChainId, bytes32 allowedCaller); + /// @param remoteChainSelector CCIP selector of destination chain. + /// @param lChainId The chain id of destination chain by Lombard Multi Chain Id conversion. + /// @param allowedCaller The address that's allowed to call the bridge on the destination chain. + event PathRemoved(uint64 indexed remoteChainSelector, bytes32 indexed lChainId, bytes32 allowedCaller); + event LombardConfigurationSet(address indexed verifier, address indexed bridge, address indexed tokenAdapter); + + struct Path { + /// @notice The address that's allowed to call the bridge on the destination chain. + bytes32 allowedCaller; + /// @notice Lombard chain id of destination chain. + bytes32 lChainId; + } string public constant override typeAndVersion = "LombardTokenPool 1.7.0-dev"; - /// @notice Lombard verifier proxy / resolver address. lockOrBurn fetches the outbound implementation and forwards tokens to it. - address private immutable i_lombardVerifierResolver; + /// @notice Supported bridge message version. + uint8 internal constant SUPPORTED_BRIDGE_MSG_VERSION = 1; + /// @notice The address of bridge contract. + IBridgeV1 public immutable i_bridge; + /// @notice Lombard verifier resolver address. lockOrBurn fetches the outbound implementation and forwards tokens to it. + address internal immutable i_lombardVerifierResolver; + /// @notice Optional token adapter used for chains like Avalanche BTC.b. Since each pool manages a single token, + /// and the adapter is a source-chain-level replacement for that token, there can only be one adapter per pool. + address internal immutable i_tokenAdapter; + + /// @notice Mapping of CCIP chain selector to chain specific config. + mapping(uint64 chainSelector => Path path) internal s_chainSelectorToPath; + /// @param verifier The address of Lombard verifier resolver. Used in V2 flows to fetch the outbound + /// implementation that handles token burns and cross-chain attestations. + /// @param bridge The Lombard BridgeV1 contract that handles cross-chain token transfers. + /// @param adapter Optional source-chain token address override. Used for non-upgradeable tokens like BTC.b + /// on Avalanche where an adapter contract performs mint/burn on behalf of the actual token. When set, this + /// address is passed to bridge.deposit() instead of the pool's token address. Set to address(0) if not needed. constructor( IERC20Metadata token, address verifier, + IBridgeV1 bridge, + address adapter, address advancedPoolHooks, address rmnProxy, address router, uint8 fallbackDecimals ) TokenPool(token, _getTokenDecimals(token, fallbackDecimals), advancedPoolHooks, rmnProxy, router) { + if (address(bridge) == address(0)) { + revert ZeroBridge(); + } + uint8 bridgeMsgVersion = bridge.MSG_VERSION(); + if (bridgeMsgVersion != SUPPORTED_BRIDGE_MSG_VERSION) { + revert InvalidMessageVersion(SUPPORTED_BRIDGE_MSG_VERSION, bridgeMsgVersion); + } if (verifier == address(0)) { revert ZeroVerifierNotAllowed(); } + i_bridge = bridge; i_lombardVerifierResolver = verifier; - emit LombardVerifierSet(verifier); + i_tokenAdapter = adapter; + emit LombardConfigurationSet(verifier, address(bridge), adapter); } // ================================================================ @@ -67,22 +122,141 @@ contract LombardTokenPool is TokenPool, ITypeAndVersion { return super.lockOrBurn(lockOrBurnIn, blockConfirmationRequested, tokenArgs); } + /// @notice Backwards compatible lockOrBurn for lanes using the V1 flow. + /// @dev Token minting is performed by the Lombard bridge's mailbox during deliverAndHandle. + /// This pool only validates the proof and emits events; no _lockOrBurn call is needed. function lockOrBurn( - Pool.LockOrBurnInV1 calldata - ) public pure override(TokenPool) returns (Pool.LockOrBurnOutV1 memory lockOrBurnOut) { - // TODO: Implement V1 path for backward compatability with old lanes. - return lockOrBurnOut; + Pool.LockOrBurnInV1 calldata lockOrBurnIn + ) public override(TokenPool) returns (Pool.LockOrBurnOutV1 memory lockOrBurnOut) { + _validateLockOrBurn(lockOrBurnIn, WAIT_FOR_FINALITY, ""); + + Path memory path = s_chainSelectorToPath[lockOrBurnIn.remoteChainSelector]; + if (path.allowedCaller == bytes32(0)) { + revert PathNotExist(lockOrBurnIn.remoteChainSelector); + } + + // For some tokens we need to override the source token with an adapter + address sourceTokenOrAdapter = i_tokenAdapter != address(0) ? i_tokenAdapter : address(i_token); + // verify bridge destination token equal to pool + bytes32 bridgeDestToken = i_bridge.getAllowedDestinationToken(path.lChainId, sourceTokenOrAdapter); + bytes32 poolDestToken = abi.decode(getRemoteToken(lockOrBurnIn.remoteChainSelector), (bytes32)); + if (bridgeDestToken != poolDestToken) { + revert RemoteTokenMismatch(bridgeDestToken, poolDestToken); + } + + if (lockOrBurnIn.receiver.length != 32) { + revert InvalidReceiver(lockOrBurnIn.receiver); + } + + (, bytes32 payloadHash) = i_bridge.deposit({ + destinationChain: path.lChainId, + token: sourceTokenOrAdapter, + sender: lockOrBurnIn.originalSender, + recipient: abi.decode(lockOrBurnIn.receiver, (bytes32)), + amount: lockOrBurnIn.amount, + destinationCaller: path.allowedCaller + }); + + emit LockedOrBurned({ + remoteChainSelector: lockOrBurnIn.remoteChainSelector, + token: address(i_token), + sender: lockOrBurnIn.originalSender, + amount: lockOrBurnIn.amount + }); + + return Pool.LockOrBurnOutV1({ + destTokenAddress: getRemoteToken(lockOrBurnIn.remoteChainSelector), + destPoolData: abi.encode(payloadHash) + }); } // ================================================================ // │ Release or Mint │ // ================================================================ + /// @notice Backwards compatible releaseOrMint for CCIP 1.5/1.6 lanes. Verifies the bridge payload proof. function releaseOrMint( - Pool.ReleaseOrMintInV1 calldata - ) public pure override(TokenPool) returns (Pool.ReleaseOrMintOutV1 memory releaseOrMintOut) { - // TODO: Implement V1 path for backward compatability with old lanes. - return releaseOrMintOut; + Pool.ReleaseOrMintInV1 calldata releaseOrMintIn + ) public virtual override returns (Pool.ReleaseOrMintOutV1 memory) { + _validateReleaseOrMint(releaseOrMintIn, releaseOrMintIn.sourceDenominatedAmount, WAIT_FOR_FINALITY); + + (bytes memory rawPayload, bytes memory proof) = abi.decode(releaseOrMintIn.offchainTokenData, (bytes, bytes)); + + (bytes32 payloadHash, bool executed,) = IMailbox(i_bridge.mailbox()).deliverAndHandle(rawPayload, proof); + if (!executed) { + revert ExecutionError(); + } + // we know payload hash returned on source chain. + if (payloadHash != abi.decode(releaseOrMintIn.sourcePoolData, (bytes32))) { + revert HashMismatch(); + } + + emit ReleasedOrMinted({ + remoteChainSelector: releaseOrMintIn.remoteChainSelector, + token: address(i_token), + sender: msg.sender, + recipient: releaseOrMintIn.receiver, + amount: releaseOrMintIn.sourceDenominatedAmount + }); + + return Pool.ReleaseOrMintOutV1({destinationAmount: releaseOrMintIn.sourceDenominatedAmount}); + } + + // ================================================================ + // │ Path config │ + // ================================================================ + + /// @notice Gets the path for a given CCIP chain selector. + /// @param remoteChainSelector CCIP chain selector of remote chain. + /// @return Path struct containing lChainId and allowedCaller. + function getPath( + uint64 remoteChainSelector + ) external view returns (Path memory) { + return s_chainSelectorToPath[remoteChainSelector]; + } + + /// @notice Sets the Lombard chain id and allowed caller for a CCIP chain selector. + /// @param remoteChainSelector CCIP chain selector of remote chain. + /// @param lChainId Lombard chain id of remote chain. + /// @param allowedCaller The address of TokenPool on destination chain. + function setPath(uint64 remoteChainSelector, bytes32 lChainId, bytes calldata allowedCaller) external onlyOwner { + if (!isSupportedChain(remoteChainSelector)) { + revert ChainNotSupported(remoteChainSelector); + } + + if (lChainId == bytes32(0)) { + revert ZeroLombardChainId(); + } + + // only remote pool is expected allowed caller. + if (!isRemotePool(remoteChainSelector, allowedCaller)) { + revert InvalidRemotePoolForChain(remoteChainSelector, allowedCaller); + } + + if (allowedCaller.length != 32) { + revert InvalidAllowedCaller(allowedCaller); + } + bytes32 decodedAllowedCaller = abi.decode(allowedCaller, (bytes32)); + + s_chainSelectorToPath[remoteChainSelector] = Path({lChainId: lChainId, allowedCaller: decodedAllowedCaller}); + + emit PathSet(remoteChainSelector, lChainId, decodedAllowedCaller); + } + + /// @notice Removes path mapping for a destination chain. + /// @param remoteChainSelector CCIP chain selector of destination chain. + function removePath( + uint64 remoteChainSelector + ) external onlyOwner { + Path memory path = s_chainSelectorToPath[remoteChainSelector]; + + if (path.allowedCaller == bytes32(0)) { + revert PathNotExist(remoteChainSelector); + } + + delete s_chainSelectorToPath[remoteChainSelector]; + + emit PathRemoved(remoteChainSelector, path.lChainId, path.allowedCaller); } // ================================================================ @@ -97,8 +271,11 @@ contract LombardTokenPool is TokenPool, ITypeAndVersion { } } - /// @notice Returns the verifier resolver address. - function getVerifierResolver() external view returns (address) { - return i_lombardVerifierResolver; + /// @notice Returns the Lombard-specific configuration for this pool. + /// @return verifierResolver The address of the Lombard verifier resolver. + /// @return bridge The address of the Lombard bridge contract. + /// @return tokenAdapter The optional token adapter address (address(0) if not used). + function getLombardConfig() external view returns (address verifierResolver, address bridge, address tokenAdapter) { + return (i_lombardVerifierResolver, address(i_bridge), i_tokenAdapter); } } diff --git a/chains/evm/contracts/pools/Lombard/interfaces/IBridgeV1.sol b/chains/evm/contracts/pools/Lombard/interfaces/IBridgeV1.sol new file mode 100644 index 0000000000..eb407f1a8b --- /dev/null +++ b/chains/evm/contracts/pools/Lombard/interfaces/IBridgeV1.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +/// @custom:security-contact legal@lombard.finance +interface IBridgeV1 { + event DestinationBridgeSet(bytes32 indexed destinationChain, bytes32 indexed destinationBridge); + event DestinationTokenAdded( + bytes32 indexed destinationChain, bytes32 indexed destinationToken, address indexed sourceToken + ); + event DestinationTokenRemoved( + bytes32 indexed destinationChain, bytes32 indexed destinationToken, address indexed sourceToken + ); + event RateLimitsSet(address indexed token, bytes32 indexed sourceChainId, uint256 limit, uint256 window); + + event SenderConfigChanged(address indexed sender, uint32 feeDiscount, bool whitelisted); + + /// @notice Emitted when the is a deposit in the bridge + event DepositToBridge(address indexed fromAddress, bytes32 indexed toAddress, bytes32 indexed payloadHash); + + /// @notice Emitted when a withdraw is made from the bridge + event WithdrawFromBridge(address indexed recipient, bytes32 indexed chainId, address indexed token, uint256 amount); + + function mailbox() external view returns (address); + + function MSG_VERSION() external view returns (uint8); + + function deposit( + bytes32 destinationChain, + address token, + address sender, + bytes32 recipient, + uint256 amount, + bytes32 destinationCaller + ) external payable returns (uint256, bytes32); + + function getAllowedDestinationToken(bytes32 destinationChain, address sourceToken) external view returns (bytes32); +} diff --git a/chains/evm/contracts/pools/Lombard/interfaces/IMailbox.sol b/chains/evm/contracts/pools/Lombard/interfaces/IMailbox.sol new file mode 100644 index 0000000000..7fe417c73c --- /dev/null +++ b/chains/evm/contracts/pools/Lombard/interfaces/IMailbox.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +interface IMailbox { + error Mailbox_ZeroChainId(); + error Mailbox_ZeroConsortium(); + error Mailbox_ZeroMailbox(); + error Mailbox_ZeroRecipient(); + error Mailbox_ZeroAmount(); + error Mailbox_MessagePathEnabled(bytes32 id); + error Mailbox_MessagePathDisabled(bytes32 id); + error Mailbox_UnexpectedDestinationCaller(address expected, address actual); + error Mailbox_HandlerNotImplemented(); + error Mailbox_PayloadOversize(uint32 max, uint256 actual); + error Mailbox_NotEnoughFee(uint256 expected, uint256 actual); + error Mailbox_CallFailed(); + + event MessagePathEnabled( + bytes32 indexed destinationChain, + bytes32 indexed inboundMessagePath, + bytes32 indexed outboundMessagePath, + bytes32 destinationMailbox + ); + + event MessagePathDisabled( + bytes32 indexed destinationChain, + bytes32 indexed inboundMessagePath, + bytes32 indexed outboundMessagePath, + bytes32 destinationMailbox + ); + + event MessageSent( + bytes32 indexed destinationLChainId, address indexed msgSender, bytes32 indexed recipient, bytes payload + ); + + /// Message payment receipt + event MessagePaid(bytes32 indexed payloadHash, address indexed msgSender, uint256 payloadSize, uint256 value); + + event MessageDelivered( + bytes32 indexed payloadHash, address indexed caller, uint256 indexed nonce, bytes32 msgSender, bytes payload + ); + + event MessageHandled(bytes32 indexed payloadHash, address indexed destinationCaller, bytes executionResult); + + event MessageHandleError( + bytes32 indexed payloadHash, address indexed destinationCaller, string reason, bytes customError + ); + + event SenderConfigUpdated(address indexed sender, uint64 maxPayloadSize, bool feeDisabled); + + event DefaultPayloadSizeSet(uint64 maxPayloadSize); + + event FeePerByteSet(uint256 fee); + + event FeeWithdrawn(address indexed treasury, uint256 amount); + + function deliverAndHandle( + bytes calldata rawPayload, + bytes calldata proof + ) external returns (bytes32, bool, bytes memory); +} diff --git a/chains/evm/contracts/test/helpers/LombardTokenPoolHelper.sol b/chains/evm/contracts/test/helpers/LombardTokenPoolHelper.sol index c9a4f23760..41e46fad94 100644 --- a/chains/evm/contracts/test/helpers/LombardTokenPoolHelper.sol +++ b/chains/evm/contracts/test/helpers/LombardTokenPoolHelper.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; +import {IBridgeV1} from "../../pools/Lombard/interfaces/IBridgeV1.sol"; + import {LombardTokenPool} from "../../pools/Lombard/LombardTokenPool.sol"; import {IERC20Metadata} from "@openzeppelin/contracts@4.8.3/token/ERC20/extensions/IERC20Metadata.sol"; @@ -8,10 +10,13 @@ contract LombardTokenPoolHelper is LombardTokenPool { constructor( IERC20Metadata token, address verifier, + IBridgeV1 bridge, + address adapter, + address advancedPoolHooks, address rmnProxy, address router, uint8 fallbackDecimals - ) LombardTokenPool(token, verifier, address(0), rmnProxy, router, fallbackDecimals) {} + ) LombardTokenPool(token, verifier, bridge, adapter, advancedPoolHooks, rmnProxy, router, fallbackDecimals) {} function getTokenDecimals(IERC20Metadata token, uint8 fallbackDecimals) external view returns (uint8) { return _getTokenDecimals(token, fallbackDecimals); diff --git a/chains/evm/contracts/test/mocks/MockLombardBridgeV1.sol b/chains/evm/contracts/test/mocks/MockLombardBridgeV1.sol new file mode 100644 index 0000000000..159f580b42 --- /dev/null +++ b/chains/evm/contracts/test/mocks/MockLombardBridgeV1.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import {IBridgeV1} from "../../pools/Lombard/interfaces/IBridgeV1.sol"; + +// solhint-disable func-name-mixedcase + +contract MockLombardBridgeV1 is IBridgeV1 { + uint8 internal immutable i_msgVersion; + address internal s_mailbox; + + /// @dev Stores the token address from the last deposit call for test assertions. + address public s_lastDepositToken; + + mapping(bytes32 destinationChain => mapping(address sourceToken => bytes32 destinationToken)) internal + s_allowedDestinationTokens; + + constructor(uint8 msgVersion, address mailbox_) { + i_msgVersion = msgVersion; + s_mailbox = mailbox_; + } + + function setMailbox( + address mailbox_ + ) external { + s_mailbox = mailbox_; + } + + function setAllowedDestinationToken(bytes32 destinationChain, address sourceToken, bytes32 destinationToken) external { + s_allowedDestinationTokens[destinationChain][sourceToken] = destinationToken; + } + + function MSG_VERSION() external view returns (uint8) { + return i_msgVersion; + } + + function mailbox() external view returns (address) { + return s_mailbox; + } + + function deposit( + bytes32, // destinationChain + address token, + address, // sender + bytes32, // recipient + uint256, // amount + bytes32, // destinationCaller + bytes calldata // payload + ) external payable returns (uint256 nonce, bytes32 payloadHash) { + s_lastDepositToken = token; + return (1, keccak256(abi.encodePacked(block.timestamp, token))); + } + + function deposit( + bytes32, // destinationChain + address token, + address, // sender + bytes32, // recipient + uint256, // amount + bytes32 // destinationCaller + ) external payable returns (uint256 nonce, bytes32 payloadHash) { + s_lastDepositToken = token; + return (1, keccak256(abi.encodePacked(block.timestamp, token))); + } + + function getAllowedDestinationToken(bytes32 destinationChain, address sourceToken) external view returns (bytes32) { + return s_allowedDestinationTokens[destinationChain][sourceToken]; + } +} diff --git a/chains/evm/contracts/test/mocks/MockMailbox.sol b/chains/evm/contracts/test/mocks/MockMailbox.sol new file mode 100644 index 0000000000..5eac9acb1e --- /dev/null +++ b/chains/evm/contracts/test/mocks/MockMailbox.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import {IMailbox} from "../../pools/Lombard/interfaces/IMailbox.sol"; + +contract MockMailbox is IMailbox { + bytes32 internal s_payloadHash; + bool internal s_executed = true; + bytes internal s_executionResult; + + bytes public s_lastRawPayload; + bytes public s_lastProof; + + function setResult(bytes32 payloadHash, bool executed, bytes calldata executionResult) external { + s_payloadHash = payloadHash; + s_executed = executed; + s_executionResult = executionResult; + } + + function deliverAndHandle( + bytes calldata rawPayload, + bytes calldata proof + ) external returns (bytes32, bool, bytes memory) { + s_lastRawPayload = rawPayload; + s_lastProof = proof; + bytes32 payloadHash = s_payloadHash != bytes32(0) ? s_payloadHash : keccak256(rawPayload); + return (payloadHash, s_executed, s_executionResult); + } +} diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._getTokenDecimals.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._getTokenDecimals.t.sol index 7b3cc12f43..45920d2b06 100644 --- a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._getTokenDecimals.t.sol +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._getTokenDecimals.t.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.24; import {BaseTest} from "../../BaseTest.t.sol"; import {LombardTokenPoolHelper} from "../../helpers/LombardTokenPoolHelper.sol"; + +import {MockLombardBridgeV1} from "../../mocks/MockLombardBridgeV1.sol"; import {MockVerifier} from "../../mocks/MockVerifier.sol"; import {BurnMintERC20} from "@chainlink/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol"; @@ -12,14 +14,23 @@ contract LombardTokenPool_getTokenDecimals is BaseTest { BurnMintERC20 internal s_token; LombardTokenPoolHelper internal s_helper; MockVerifier internal s_resolver; - address internal constant VERIFIER = address(0xBEEF); + MockLombardBridgeV1 internal s_bridge; function setUp() public override { super.setUp(); s_token = new BurnMintERC20("Lombard", "LBD", 18, 0, 0); s_resolver = new MockVerifier(""); - s_helper = - new LombardTokenPoolHelper(s_token, address(s_resolver), address(s_mockRMNRemote), address(s_sourceRouter), 18); + s_bridge = new MockLombardBridgeV1(1, address(0)); + s_helper = new LombardTokenPoolHelper( + s_token, + address(s_resolver), + s_bridge, + address(0), + address(0), + address(s_mockRMNRemote), + address(s_sourceRouter), + 18 + ); } function test_getTokenDecimals_UsesTokenDecimals() public view { diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._lockOrBurn.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._lockOrBurn.t.sol index 084a10d8db..1d26c1ec39 100644 --- a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._lockOrBurn.t.sol +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool._lockOrBurn.t.sol @@ -18,7 +18,7 @@ contract LombardTokenPool_lockOrBurn is LombardTokenPoolSetup { (Pool.LockOrBurnOutV1 memory out, uint256 destAmount) = s_pool.lockOrBurn( Pool.LockOrBurnInV1({ - receiver: abi.encodePacked(address(0xDEAD)), + receiver: abi.encodePacked(s_receiver), remoteChainSelector: DEST_CHAIN_SELECTOR, originalSender: OWNER, amount: amount, @@ -47,7 +47,7 @@ contract LombardTokenPool_lockOrBurn is LombardTokenPoolSetup { vm.expectRevert(LombardTokenPool.OutboundImplementationNotFoundForVerifier.selector); s_pool.lockOrBurn( Pool.LockOrBurnInV1({ - receiver: abi.encodePacked(address(0xDEAD)), + receiver: abi.encodePacked(s_receiver), remoteChainSelector: DEST_CHAIN_SELECTOR, originalSender: OWNER, amount: amount, diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.constructor.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.constructor.t.sol index e5d795a41d..ed487b2dab 100644 --- a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.constructor.t.sol +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.constructor.t.sol @@ -2,12 +2,16 @@ pragma solidity ^0.8.24; import {LombardTokenPool} from "../../../pools/Lombard/LombardTokenPool.sol"; +import {IBridgeV1} from "../../../pools/Lombard/interfaces/IBridgeV1.sol"; + +import {MockLombardBridgeV1} from "../../mocks/MockLombardBridgeV1.sol"; import {MockVerifier} from "../../mocks/MockVerifier.sol"; import {BurnMintERC20} from "@chainlink/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol"; import {Test} from "forge-std/Test.sol"; contract LombardTokenPool_constructor is Test { BurnMintERC20 internal s_token; + MockLombardBridgeV1 internal s_bridge; address internal s_resolver; address internal constant RMN = address(0xAA01); address internal constant ROUTER = address(0xBB02); @@ -15,18 +19,33 @@ contract LombardTokenPool_constructor is Test { function setUp() public { s_token = new BurnMintERC20("Lombard", "LBD", 18, 0, 0); s_resolver = address(new MockVerifier("")); + s_bridge = new MockLombardBridgeV1(1, address(0)); } function test_constructor() public { - vm.expectEmit(); - emit LombardTokenPool.LombardVerifierSet(s_resolver); - LombardTokenPool pool = new LombardTokenPool(s_token, s_resolver, address(0), RMN, ROUTER, 18); - assertEq(pool.getVerifierResolver(), address(s_resolver)); + address adapter = makeAddr("adapter"); + LombardTokenPool pool = new LombardTokenPool(s_token, s_resolver, s_bridge, adapter, address(0), RMN, ROUTER, 18); + + (address verifierResolver, address bridge, address tokenAdapter) = pool.getLombardConfig(); + assertEq(verifierResolver, s_resolver); + assertEq(bridge, address(s_bridge)); + assertEq(tokenAdapter, adapter); assertEq(pool.typeAndVersion(), "LombardTokenPool 1.7.0-dev"); } function test_constructor_ZeroVerifierNotAllowed() public { vm.expectRevert(LombardTokenPool.ZeroVerifierNotAllowed.selector); - new LombardTokenPool(s_token, address(0), address(0), RMN, ROUTER, 18); + new LombardTokenPool(s_token, address(0), s_bridge, address(0), address(0), RMN, ROUTER, 18); + } + + function test_constructor_RevertsWhen_InvalidBridgeVersion() public { + MockLombardBridgeV1 wrongVersionBridge = new MockLombardBridgeV1(2, address(0)); + vm.expectRevert(abi.encodeWithSelector(LombardTokenPool.InvalidMessageVersion.selector, 1, 2)); + new LombardTokenPool(s_token, s_resolver, wrongVersionBridge, address(0), address(0), RMN, ROUTER, 18); + } + + function test_constructor_RevertsWhen_ZeroBridge() public { + vm.expectRevert(LombardTokenPool.ZeroBridge.selector); + new LombardTokenPool(s_token, s_resolver, IBridgeV1(address(0)), address(0), address(0), RMN, ROUTER, 18); } } diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.lockOrBurn.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.lockOrBurn.t.sol new file mode 100644 index 0000000000..299e30a8b8 --- /dev/null +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.lockOrBurn.t.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import {IBridgeV1} from "../../../pools/Lombard/interfaces/IBridgeV1.sol"; + +import {Pool} from "../../../libraries/Pool.sol"; +import {LombardTokenPool} from "../../../pools/Lombard/LombardTokenPool.sol"; +import {TokenPool} from "../../../pools/TokenPool.sol"; +import {LombardTokenPoolHelper} from "../../helpers/LombardTokenPoolHelper.sol"; +import {LombardTokenPoolSetup} from "./LombardTokenPoolSetup.t.sol"; + +contract LombardTokenPool_lockOrBurn is LombardTokenPoolSetup { + bytes32 internal constant L_CHAIN_ID = bytes32("LCHAIN"); + + function setUp() public virtual override { + super.setUp(); + vm.startPrank(s_allowedOnRamp); + } + + function test_lockOrBurn_V2_ForwardsToVerifier() public { + uint256 amount = 1e18; + deal(address(s_token), address(s_pool), amount); + + (Pool.LockOrBurnOutV1 memory out, uint256 destAmount) = s_pool.lockOrBurn( + Pool.LockOrBurnInV1({ + receiver: abi.encodePacked(s_receiver), + remoteChainSelector: DEST_CHAIN_SELECTOR, + originalSender: OWNER, + amount: amount, + localToken: address(s_token) + }), + 0, + "" + ); + + assertEq(destAmount, amount); + assertEq(out.destTokenAddress, abi.encode(s_remoteToken)); + assertEq(out.destPoolData, abi.encode(uint8(DEFAULT_TOKEN_DECIMALS))); + assertEq(s_token.balanceOf(s_verifierResolver.getOutboundImplementation(DEST_CHAIN_SELECTOR, "")), amount); + assertEq(s_token.balanceOf(address(s_pool)), 0); + } + + function test_lockOrBurn_V1() public { + uint256 amount = 1e18; + deal(address(s_token), address(s_pool), amount); + + _configurePathAndBridgeRemoteToken(bytes32(uint256(uint160(s_remoteToken)))); + + vm.expectCall( + address(s_bridge), + abi.encodeCall( + IBridgeV1.deposit, + ( + L_CHAIN_ID, + address(s_token), + OWNER, + bytes32(uint256(uint160(s_receiver))), + amount, + bytes32(uint256(uint160(s_remotePool))) + ) + ) + ); + + vm.expectEmit(); + emit TokenPool.LockedOrBurned({ + remoteChainSelector: DEST_CHAIN_SELECTOR, + token: address(s_token), + sender: OWNER, + amount: amount + }); + + Pool.LockOrBurnOutV1 memory out = s_pool.lockOrBurn( + Pool.LockOrBurnInV1({ + receiver: abi.encode(s_receiver), + remoteChainSelector: DEST_CHAIN_SELECTOR, + originalSender: OWNER, + amount: amount, + localToken: address(s_token) + }) + ); + + assertEq(out.destTokenAddress, abi.encode(s_remoteToken)); + } + + function test_lockOrBurn_V1_UsesAdapterWhenConfigured() public { + address tokenAdapter = makeAddr("adapter"); + + changePrank(OWNER); + LombardTokenPoolHelper adapterPool = new LombardTokenPoolHelper( + s_token, + address(s_verifierResolver), + s_bridge, + tokenAdapter, + address(0), + address(s_mockRMNRemote), + address(s_sourceRouter), + DEFAULT_TOKEN_DECIMALS + ); + _applyChainUpdates(address(adapterPool)); + + bytes32 remoteTokenId = bytes32(uint256(uint160(s_initialRemoteToken))); + adapterPool.setPath(DEST_CHAIN_SELECTOR, L_CHAIN_ID, abi.encode(s_initialRemotePool)); + s_bridge.setAllowedDestinationToken(L_CHAIN_ID, tokenAdapter, remoteTokenId); + changePrank(s_allowedOnRamp); + + uint256 amount = 1e18; + deal(address(s_token), address(adapterPool), amount); + + vm.expectEmit(); + emit TokenPool.LockedOrBurned({ + remoteChainSelector: DEST_CHAIN_SELECTOR, + token: address(s_token), + sender: OWNER, + amount: amount + }); + + Pool.LockOrBurnOutV1 memory out = adapterPool.lockOrBurn( + Pool.LockOrBurnInV1({ + receiver: abi.encode(s_adapterReceiver), + remoteChainSelector: DEST_CHAIN_SELECTOR, + originalSender: OWNER, + amount: amount, + localToken: address(s_token) + }) + ); + + assertEq(out.destTokenAddress, abi.encode(s_initialRemoteToken)); + assertEq(s_bridge.s_lastDepositToken(), tokenAdapter); + } + + function test_lockOrBurn_V2_RevertWhen_OutboundImplementationNotFoundForVerifier() public { + uint256 amount = 1e18; + deal(address(s_token), address(s_pool), amount); + vm.mockCall( + address(s_verifierResolver), + abi.encodeCall(s_verifierResolver.getOutboundImplementation, (DEST_CHAIN_SELECTOR, "")), + abi.encode(address(0)) + ); + + vm.expectRevert(LombardTokenPool.OutboundImplementationNotFoundForVerifier.selector); + s_pool.lockOrBurn( + Pool.LockOrBurnInV1({ + receiver: abi.encodePacked(s_receiver), + remoteChainSelector: DEST_CHAIN_SELECTOR, + originalSender: OWNER, + amount: amount, + localToken: address(s_token) + }), + 0, + "" + ); + } + + function test_lockOrBurn_V1_RevertWhen_PathNotExist() public { + vm.expectRevert(abi.encodeWithSelector(LombardTokenPool.PathNotExist.selector, DEST_CHAIN_SELECTOR)); + s_pool.lockOrBurn( + Pool.LockOrBurnInV1({ + receiver: abi.encodePacked(s_releaseRecipient), + remoteChainSelector: DEST_CHAIN_SELECTOR, + originalSender: OWNER, + amount: 1e18, + localToken: address(s_token) + }) + ); + } + + function test_lockOrBurn_V1_RevertWhen_InvalidReceiver() public { + _configurePathAndBridgeRemoteToken(bytes32(uint256(uint160(s_remoteToken)))); + + vm.expectRevert(abi.encodeWithSelector(LombardTokenPool.InvalidReceiver.selector, hex"1234")); + s_pool.lockOrBurn( + Pool.LockOrBurnInV1({ + receiver: hex"1234", + remoteChainSelector: DEST_CHAIN_SELECTOR, + originalSender: OWNER, + amount: 1e18, + localToken: address(s_token) + }) + ); + } + + function test_lockOrBurn_V1_RevertWhen_RemoteTokenMismatch() public { + _configurePathAndBridgeRemoteToken(bytes32("differentToken")); + + vm.expectRevert( + abi.encodeWithSelector( + LombardTokenPool.RemoteTokenMismatch.selector, + bytes32("differentToken"), + bytes32(uint256(uint160(s_remoteToken))) + ) + ); + s_pool.lockOrBurn( + Pool.LockOrBurnInV1({ + receiver: abi.encode(s_receiver), + remoteChainSelector: DEST_CHAIN_SELECTOR, + originalSender: OWNER, + amount: 1e18, + localToken: address(s_token) + }) + ); + } + + function _configurePathAndBridgeRemoteToken( + bytes32 remoteTokenId + ) internal { + changePrank(OWNER); + s_pool.setPath(DEST_CHAIN_SELECTOR, L_CHAIN_ID, abi.encode(s_remotePool)); + s_bridge.setAllowedDestinationToken(L_CHAIN_ID, address(s_token), remoteTokenId); + changePrank(s_allowedOnRamp); + } +} diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.releaseOrMint.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.releaseOrMint.t.sol new file mode 100644 index 0000000000..a476a116c0 --- /dev/null +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.releaseOrMint.t.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import {Pool} from "../../../libraries/Pool.sol"; +import {LombardTokenPool} from "../../../pools/Lombard/LombardTokenPool.sol"; +import {TokenPool} from "../../../pools/TokenPool.sol"; +import {MockMailbox} from "../../mocks/MockMailbox.sol"; +import {LombardTokenPoolSetup} from "./LombardTokenPoolSetup.t.sol"; + +contract LombardTokenPool_releaseOrMint is LombardTokenPoolSetup { + function setUp() public virtual override { + super.setUp(); + vm.startPrank(s_allowedOffRamp); + } + + bytes32 internal constant PAYLOAD_HASH = bytes32("payload-hash"); + + function test_releaseOrMint_V1() public { + MockMailbox mailbox = new MockMailbox(); + mailbox.setResult(PAYLOAD_HASH, true, ""); + s_bridge.setMailbox(address(mailbox)); + bytes memory rawPayload = bytes("rawPayload"); + Pool.ReleaseOrMintInV1 memory releaseOrMintIn = Pool.ReleaseOrMintInV1({ + originalSender: abi.encodePacked(OWNER), + remoteChainSelector: DEST_CHAIN_SELECTOR, + receiver: s_releaseRecipient, + sourceDenominatedAmount: 5e17, + localToken: address(s_token), + sourcePoolAddress: abi.encode(s_remotePool), + sourcePoolData: abi.encode(PAYLOAD_HASH), + offchainTokenData: abi.encode(rawPayload, bytes("proof")) + }); + + vm.expectEmit(); + emit TokenPool.ReleasedOrMinted({ + remoteChainSelector: DEST_CHAIN_SELECTOR, + token: address(s_token), + sender: s_allowedOffRamp, + recipient: releaseOrMintIn.receiver, + amount: releaseOrMintIn.sourceDenominatedAmount + }); + + Pool.ReleaseOrMintOutV1 memory out = s_pool.releaseOrMint(releaseOrMintIn); + + assertEq(out.destinationAmount, releaseOrMintIn.sourceDenominatedAmount); + assertEq(mailbox.s_lastRawPayload(), rawPayload); + } + + function test_releaseOrMint_V1_RevertWhen_ExecutionError() public { + MockMailbox mailbox = new MockMailbox(); + mailbox.setResult(PAYLOAD_HASH, false, ""); + s_bridge.setMailbox(address(mailbox)); + + Pool.ReleaseOrMintInV1 memory releaseOrMintIn = Pool.ReleaseOrMintInV1({ + originalSender: abi.encodePacked(OWNER), + remoteChainSelector: DEST_CHAIN_SELECTOR, + receiver: s_releaseRecipient, + sourceDenominatedAmount: 1, + localToken: address(s_token), + sourcePoolAddress: abi.encode(s_remotePool), + sourcePoolData: abi.encode(PAYLOAD_HASH), + offchainTokenData: abi.encode(bytes("raw"), bytes("proof")) + }); + + vm.expectRevert(LombardTokenPool.ExecutionError.selector); + s_pool.releaseOrMint(releaseOrMintIn); + } + + function test_releaseOrMint_V1_RevertWhen_HashMismatch() public { + MockMailbox mailbox = new MockMailbox(); + mailbox.setResult(bytes32("different"), true, ""); + s_bridge.setMailbox(address(mailbox)); + + Pool.ReleaseOrMintInV1 memory releaseOrMintIn = Pool.ReleaseOrMintInV1({ + originalSender: abi.encodePacked(OWNER), + remoteChainSelector: DEST_CHAIN_SELECTOR, + receiver: s_releaseRecipient, + sourceDenominatedAmount: 1, + localToken: address(s_token), + sourcePoolAddress: abi.encode(s_remotePool), + sourcePoolData: abi.encode(PAYLOAD_HASH), + offchainTokenData: abi.encode(bytes("raw"), bytes("proof")) + }); + + vm.expectRevert(LombardTokenPool.HashMismatch.selector); + s_pool.releaseOrMint(releaseOrMintIn); + } +} diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.setPath.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.setPath.t.sol new file mode 100644 index 0000000000..09717dd63d --- /dev/null +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool.setPath.t.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import {LombardTokenPool} from "../../../pools/Lombard/LombardTokenPool.sol"; +import {TokenPool} from "../../../pools/TokenPool.sol"; +import {LombardTokenPoolSetup} from "./LombardTokenPoolSetup.t.sol"; + +contract LombardTokenPool_setPath is LombardTokenPoolSetup { + bytes32 internal constant L_CHAIN_ID = bytes32("LCHAIN"); + + function test_setPath() public { + bytes32 expectedAllowedCaller = bytes32(uint256(uint160(s_remotePool))); + + vm.expectEmit(); + emit LombardTokenPool.PathSet(DEST_CHAIN_SELECTOR, L_CHAIN_ID, expectedAllowedCaller); + s_pool.setPath(DEST_CHAIN_SELECTOR, L_CHAIN_ID, abi.encode(s_remotePool)); + + LombardTokenPool.Path memory path = s_pool.getPath(DEST_CHAIN_SELECTOR); + assertEq(path.lChainId, L_CHAIN_ID); + assertEq(path.allowedCaller, expectedAllowedCaller); + } + + function test_setPath_RevertWhen_ChainNotSupported() public { + vm.expectRevert(abi.encodeWithSelector(LombardTokenPool.ChainNotSupported.selector, 999)); + s_pool.setPath(999, L_CHAIN_ID, abi.encode(s_remotePool)); + } + + function test_setPath_RevertWhen_ZeroLChainId() public { + vm.expectRevert(LombardTokenPool.ZeroLombardChainId.selector); + s_pool.setPath(DEST_CHAIN_SELECTOR, bytes32(0), abi.encode(s_remotePool)); + } + + function test_setPath_RevertWhen_InvalidRemotePoolForChain() public { + vm.expectRevert( + abi.encodeWithSelector(TokenPool.InvalidRemotePoolForChain.selector, DEST_CHAIN_SELECTOR, hex"1234") + ); + s_pool.setPath(DEST_CHAIN_SELECTOR, L_CHAIN_ID, hex"1234"); + } + + function test_setPath_RevertWhen_InvalidAllowedCaller() public { + bytes memory remotePoolAddress = hex"1234"; + s_pool.addRemotePool(DEST_CHAIN_SELECTOR, remotePoolAddress); + + vm.expectRevert(abi.encodeWithSelector(LombardTokenPool.InvalidAllowedCaller.selector, remotePoolAddress)); + s_pool.setPath(DEST_CHAIN_SELECTOR, L_CHAIN_ID, remotePoolAddress); + } +} diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPoolSetup.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPoolSetup.t.sol index fbb23d53cf..cab491f4e0 100644 --- a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPoolSetup.t.sol +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPoolSetup.t.sol @@ -4,23 +4,36 @@ pragma solidity ^0.8.24; import {Router} from "../../../Router.sol"; import {TokenPool} from "../../../pools/TokenPool.sol"; import {LombardTokenPoolHelper} from "../../helpers/LombardTokenPoolHelper.sol"; +import {MockLombardBridgeV1} from "../../mocks/MockLombardBridgeV1.sol"; import {MockVerifier} from "../../mocks/MockVerifier.sol"; import {TokenPoolSetup} from "../TokenPool/TokenPoolSetup.t.sol"; contract LombardTokenPoolSetup is TokenPoolSetup { LombardTokenPoolHelper internal s_pool; MockVerifier internal s_verifierResolver; + MockLombardBridgeV1 internal s_bridge; address internal constant VERIFIER_IMPL = address(0x2345); address internal s_remotePool = makeAddr("remotePool"); address internal s_remoteToken = makeAddr("remoteToken"); + address internal s_receiver = makeAddr("receiver"); + address internal s_releaseRecipient = makeAddr("releaseRecipient"); + address internal s_adapterReceiver = makeAddr("adapterReceiver"); function setUp() public virtual override { super.setUp(); s_verifierResolver = new MockVerifier(""); + s_bridge = new MockLombardBridgeV1(1, address(0)); s_pool = new LombardTokenPoolHelper( - s_token, address(s_verifierResolver), address(s_mockRMNRemote), address(s_sourceRouter), DEFAULT_TOKEN_DECIMALS + s_token, + address(s_verifierResolver), + s_bridge, + address(0), + address(0), + address(s_mockRMNRemote), + address(s_sourceRouter), + DEFAULT_TOKEN_DECIMALS ); // Configure remote chain. diff --git a/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool_removePath.t.sol b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool_removePath.t.sol new file mode 100644 index 0000000000..8e426f56d2 --- /dev/null +++ b/chains/evm/contracts/test/pools/LombardTokenPool/LombardTokenPool_removePath.t.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import {LombardTokenPool} from "../../../pools/Lombard/LombardTokenPool.sol"; +import {LombardTokenPoolSetup} from "./LombardTokenPoolSetup.t.sol"; + +contract LombardTokenPool_removePath is LombardTokenPoolSetup { + bytes32 internal constant L_CHAIN_ID = bytes32("LCHAIN"); + + function test_removePath_RemovesConfig() public { + s_pool.setPath(DEST_CHAIN_SELECTOR, L_CHAIN_ID, abi.encode(s_remotePool)); + + vm.expectEmit(); + emit LombardTokenPool.PathRemoved(DEST_CHAIN_SELECTOR, L_CHAIN_ID, bytes32(uint256(uint160(s_remotePool)))); + s_pool.removePath(DEST_CHAIN_SELECTOR); + + LombardTokenPool.Path memory path = s_pool.getPath(DEST_CHAIN_SELECTOR); + assertEq(path.allowedCaller, bytes32(0)); + assertEq(path.lChainId, bytes32(0)); + } + + function test_removePath_RevertWhen_PathMissing() public { + vm.expectRevert(abi.encodeWithSelector(LombardTokenPool.PathNotExist.selector, DEST_CHAIN_SELECTOR)); + s_pool.removePath(DEST_CHAIN_SELECTOR); + } +} diff --git a/chains/evm/gobindings/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/chains/evm/gobindings/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 937f5b5b13..27bd0a3731 100644 --- a/chains/evm/gobindings/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/chains/evm/gobindings/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -21,7 +21,7 @@ hybrid_lock_release_usdc_token_pool: ../solc/ccip/HybridLockReleaseUSDCTokenPool hyper_liquid_compatible_erc20: ../solc/ccip/HyperLiquidCompatibleERC20/HyperLiquidCompatibleERC20.sol/HyperLiquidCompatibleERC20.abi.json ../solc/ccip/HyperLiquidCompatibleERC20/HyperLiquidCompatibleERC20.sol/HyperLiquidCompatibleERC20.bin 1b825f6c2f7ba630ca0dbacb241c6a8cb16a5aa62cc152f5fefe40166c3d96f6 lock_release_token_pool: ../solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.abi.json ../solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.bin f2e39d422915bc08da0267b107a7d7069e689e885900f3c9de76de770406caad log_message_data_receiver: ../solc/ccip/LogMessageDataReceiver/LogMessageDataReceiver.sol/LogMessageDataReceiver.abi.json ../solc/ccip/LogMessageDataReceiver/LogMessageDataReceiver.sol/LogMessageDataReceiver.bin 6fe60e48711884eae82dd95cabb1c66a5644336719fa1219df1ceceec11e6bce -lombard_token_pool: ../solc/ccip/LombardTokenPool/LombardTokenPool.sol/LombardTokenPool.abi.json ../solc/ccip/LombardTokenPool/LombardTokenPool.sol/LombardTokenPool.bin 4bcf0226e2e2f42760f33cd6a54467ab9cc22bd1acb9bca98d77abcd105cdcdb +lombard_token_pool: ../solc/ccip/LombardTokenPool/LombardTokenPool.sol/LombardTokenPool.abi.json ../solc/ccip/LombardTokenPool/LombardTokenPool.sol/LombardTokenPool.bin a2644bb3c4cd3c270aea4349867cd447762ad1cf4f2d7bf17739e4102f053451 maybe_revert_message_receiver: ../solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.abi.json ../solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.bin ee264f67a2356cc4eebe839a5a88367cbcdc27a7520cca56263319e9afe97a1a message_hasher: ../solc/ccip/MessageHasher/MessageHasher.sol/MessageHasher.abi.json ../solc/ccip/MessageHasher/MessageHasher.sol/MessageHasher.bin cb3448514ff88dd019316135cf6c10f6b0d6afcb8ded227884c910efe4274ba1 mock_lbtc_token_pool: ../solc/ccip/MockE2ELBTCTokenPool/MockE2ELBTCTokenPool.sol/MockE2ELBTCTokenPool.abi.json ../solc/ccip/MockE2ELBTCTokenPool/MockE2ELBTCTokenPool.sol/MockE2ELBTCTokenPool.bin 2facb0a1f08881184aa28756e2218e37084f321cf7947b30693fe35d204b88d8