-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* CCIP-4566 token pool views * lint * review fixes * lint * lint
- Loading branch information
Showing
3 changed files
with
280 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,233 @@ | ||
package v1_5_1 | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/ethereum/go-ethereum/accounts/abi/bind" | ||
"github.com/ethereum/go-ethereum/common" | ||
"golang.org/x/exp/maps" | ||
|
||
"github.com/smartcontractkit/chainlink/deployment/common/view/types" | ||
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_from_mint_token_pool" | ||
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" | ||
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool" | ||
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" | ||
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" | ||
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" | ||
) | ||
|
||
type TokenPoolContract interface { | ||
Address() common.Address | ||
Owner(opts *bind.CallOpts) (common.Address, error) | ||
TypeAndVersion(*bind.CallOpts) (string, error) | ||
GetToken(opts *bind.CallOpts) (common.Address, error) | ||
GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) | ||
GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) | ||
GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) | ||
GetAllowList(opts *bind.CallOpts) ([]common.Address, error) | ||
GetAllowListEnabled(opts *bind.CallOpts) (bool, error) | ||
} | ||
|
||
func GetCurrentInboundRateLimiterState(t TokenPoolContract, remoteChainSelector uint64) (token_pool.RateLimiterTokenBucket, error) { | ||
switch v := t.(type) { | ||
case *burn_mint_token_pool.BurnMintTokenPool: | ||
state, err := v.GetCurrentInboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *burn_from_mint_token_pool.BurnFromMintTokenPool: | ||
state, err := v.GetCurrentInboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *burn_with_from_mint_token_pool.BurnWithFromMintTokenPool: | ||
state, err := v.GetCurrentInboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *lock_release_token_pool.LockReleaseTokenPool: | ||
state, err := v.GetCurrentInboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *usdc_token_pool.USDCTokenPool: | ||
state, err := v.GetCurrentInboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
default: | ||
return token_pool.RateLimiterTokenBucket{}, fmt.Errorf("unknown type %T", t) | ||
} | ||
} | ||
|
||
func GetCurrentOutboundRateLimiterState(t TokenPoolContract, remoteChainSelector uint64) (token_pool.RateLimiterTokenBucket, error) { | ||
switch v := t.(type) { | ||
case *burn_mint_token_pool.BurnMintTokenPool: | ||
state, err := v.GetCurrentOutboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *burn_from_mint_token_pool.BurnFromMintTokenPool: | ||
state, err := v.GetCurrentOutboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *burn_with_from_mint_token_pool.BurnWithFromMintTokenPool: | ||
state, err := v.GetCurrentOutboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *lock_release_token_pool.LockReleaseTokenPool: | ||
state, err := v.GetCurrentOutboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
case *usdc_token_pool.USDCTokenPool: | ||
state, err := v.GetCurrentOutboundRateLimiterState(nil, remoteChainSelector) | ||
return token_pool.RateLimiterTokenBucket(state), err | ||
default: | ||
return token_pool.RateLimiterTokenBucket{}, fmt.Errorf("unknown type %T", t) | ||
} | ||
} | ||
|
||
type RemoteChainConfig struct { | ||
// RemoteTokenAddress is the raw representation of the token address on the remote chain. | ||
RemoteTokenAddress []byte | ||
// RemotePoolAddresses are raw addresses of valid token pools on the remote chain. | ||
RemotePoolAddresses [][]byte | ||
// InboundRateLimiterConfig is the rate limiter config for inbound transfers from the remote chain. | ||
InboundRateLimterConfig token_pool.RateLimiterConfig | ||
// OutboundRateLimiterConfig is the rate limiter config for outbound transfers to the remote chain. | ||
OutboundRateLimiterConfig token_pool.RateLimiterConfig | ||
} | ||
|
||
type TokenPoolView struct { | ||
types.ContractMetaData | ||
Token common.Address `json:"token"` | ||
RemoteChainConfigs map[uint64]RemoteChainConfig `json:"remoteChainConfigs"` | ||
AllowList []common.Address `json:"allowList"` | ||
AllowListEnabled bool `json:"allowListEnable"` | ||
} | ||
|
||
type USDCTokenPoolView struct { | ||
TokenPoolView | ||
TokenMessenger common.Address | ||
MessageTransmitter common.Address | ||
LocalDomain uint32 | ||
ChainToDomain map[uint64]usdc_token_pool.USDCTokenPoolDomain | ||
} | ||
|
||
type LockReleaseTokenPoolView struct { | ||
TokenPoolView | ||
AcceptLiquidity bool | ||
Rebalancer common.Address | ||
} | ||
|
||
func GenerateTokenPoolView(pool TokenPoolContract) (TokenPoolView, error) { | ||
owner, err := pool.Owner(nil) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
typeAndVersion, err := pool.TypeAndVersion(nil) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
token, err := pool.GetToken(nil) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
allowList, err := pool.GetAllowList(nil) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
allowListEnabled, err := pool.GetAllowListEnabled(nil) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
remoteChains, err := pool.GetSupportedChains(nil) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
remoteChainConfigs := make(map[uint64]RemoteChainConfig) | ||
for _, remoteChain := range remoteChains { | ||
remotePools, err := pool.GetRemotePools(nil, remoteChain) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
remoteToken, err := pool.GetRemoteToken(nil, remoteChain) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
inboundState, err := GetCurrentInboundRateLimiterState(pool, remoteChain) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
outboundState, err := GetCurrentOutboundRateLimiterState(pool, remoteChain) | ||
if err != nil { | ||
return TokenPoolView{}, err | ||
} | ||
remoteChainConfigs[remoteChain] = RemoteChainConfig{ | ||
RemoteTokenAddress: remoteToken, | ||
RemotePoolAddresses: remotePools, | ||
InboundRateLimterConfig: token_pool.RateLimiterConfig{ | ||
IsEnabled: inboundState.IsEnabled, | ||
Capacity: inboundState.Capacity, | ||
Rate: inboundState.Rate, | ||
}, | ||
OutboundRateLimiterConfig: token_pool.RateLimiterConfig{ | ||
IsEnabled: outboundState.IsEnabled, | ||
Capacity: outboundState.Capacity, | ||
Rate: outboundState.Rate, | ||
}, | ||
} | ||
} | ||
|
||
return TokenPoolView{ | ||
ContractMetaData: types.ContractMetaData{ | ||
TypeAndVersion: typeAndVersion, | ||
Address: pool.Address(), | ||
Owner: owner, | ||
}, | ||
Token: token, | ||
RemoteChainConfigs: remoteChainConfigs, | ||
AllowList: allowList, | ||
AllowListEnabled: allowListEnabled, | ||
}, nil | ||
} | ||
|
||
func GenerateLockReleaseTokenPoolView(pool *lock_release_token_pool.LockReleaseTokenPool) (LockReleaseTokenPoolView, error) { | ||
basePoolView, err := GenerateTokenPoolView(pool) | ||
if err != nil { | ||
return LockReleaseTokenPoolView{}, err | ||
} | ||
acceptLiquidity, err := pool.CanAcceptLiquidity(nil) | ||
if err != nil { | ||
return LockReleaseTokenPoolView{}, err | ||
} | ||
rebalancer, err := pool.GetRebalancer(nil) | ||
if err != nil { | ||
return LockReleaseTokenPoolView{}, err | ||
} | ||
return LockReleaseTokenPoolView{ | ||
TokenPoolView: basePoolView, | ||
AcceptLiquidity: acceptLiquidity, | ||
Rebalancer: rebalancer, | ||
}, nil | ||
} | ||
|
||
func GenerateUSDCTokenPoolView(pool *usdc_token_pool.USDCTokenPool) (USDCTokenPoolView, error) { | ||
basePoolView, err := GenerateTokenPoolView(pool) | ||
if err != nil { | ||
return USDCTokenPoolView{}, err | ||
} | ||
tokenMessenger, err := pool.ITokenMessenger(nil) | ||
if err != nil { | ||
return USDCTokenPoolView{}, err | ||
} | ||
messageTransmitter, err := pool.IMessageTransmitter(nil) | ||
if err != nil { | ||
return USDCTokenPoolView{}, err | ||
} | ||
localDomain, err := pool.ILocalDomainIdentifier(nil) | ||
if err != nil { | ||
return USDCTokenPoolView{}, err | ||
} | ||
chainToDomain := make(map[uint64]usdc_token_pool.USDCTokenPoolDomain) | ||
remoteChains := maps.Keys(basePoolView.RemoteChainConfigs) | ||
for _, chainSel := range remoteChains { | ||
domain, err := pool.GetDomain(nil, chainSel) | ||
if err != nil { | ||
return USDCTokenPoolView{}, err | ||
} | ||
chainToDomain[chainSel] = domain | ||
} | ||
return USDCTokenPoolView{ | ||
TokenPoolView: basePoolView, | ||
TokenMessenger: tokenMessenger, | ||
MessageTransmitter: messageTransmitter, | ||
LocalDomain: localDomain, | ||
ChainToDomain: chainToDomain, | ||
}, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters