Skip to content

Commit 91ac227

Browse files
authored
feat: add Family method to the Blockchain interface and implementations (#112)
This change introduces a new method, `Family`, to the `Blockchain` interface and updates the chain implementations to return the family name of the respective blockchain. This allows for better identification of the family rather than relying on the type of the chain itself. The `ListChainSelectors` method is updated to use this method to simplify it's implementation.
1 parent 820cf3f commit 91ac227

15 files changed

+99
-68
lines changed

.changeset/mighty-dodos-smoke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"chainlink-deployments-framework": patch
3+
---
4+
5+
Adds a `Family` method to the `Blockchain` interface

chain/aptos/aptos_chain.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,8 @@ func (c Chain) String() string {
3131
func (c Chain) Name() string {
3232
return chain_common.ChainMetadata{Selector: c.Selector}.Name()
3333
}
34+
35+
// Family returns the family of the chain
36+
func (c Chain) Family() string {
37+
return chain_common.ChainMetadata{Selector: c.Selector}.Family()
38+
}

chain/aptos/aptos_chain_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,28 @@ func TestChain_ChainInfot(t *testing.T) {
1717
selector uint64
1818
wantName string
1919
wantString string
20+
wantFamily string
2021
}{
2122
{
2223
name: "returns correct info",
2324
selector: chain_selectors.APTOS_MAINNET.Selector,
2425
wantString: "aptos-mainnet (4741433654826277614)",
2526
wantName: chain_selectors.APTOS_MAINNET.Name,
27+
wantFamily: chain_selectors.FamilyAptos,
2628
},
2729
}
2830

2931
for _, tt := range tests {
3032
t.Run(tt.name, func(t *testing.T) {
3133
t.Parallel()
3234

33-
provider := aptos.Chain{
35+
c := aptos.Chain{
3436
Selector: tt.selector,
3537
}
36-
assert.Equal(t, tt.selector, provider.ChainSelector())
37-
assert.Equal(t, tt.wantString, provider.String())
38-
assert.Equal(t, tt.wantName, provider.Name())
38+
assert.Equal(t, tt.selector, c.ChainSelector())
39+
assert.Equal(t, tt.wantString, c.String())
40+
assert.Equal(t, tt.wantName, c.Name())
41+
assert.Equal(t, tt.wantFamily, c.Family())
3942
})
4043
}
4144
}

chain/blockchain.go

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package chain
22

33
import (
4-
"sort"
5-
6-
chain_selectors "github.com/smartcontractkit/chain-selectors"
4+
"slices"
75

86
"github.com/smartcontractkit/chainlink-deployments-framework/chain/aptos"
97
"github.com/smartcontractkit/chainlink-deployments-framework/chain/evm"
@@ -51,6 +49,7 @@ type BlockChain interface {
5149
// Name returns the name of the chain
5250
Name() string
5351
ChainSelector() uint64
52+
Family() string
5453
}
5554

5655
// EVMChains returns a map of all EVM chains with their selectors.
@@ -166,41 +165,13 @@ func (b BlockChains) ListChainSelectors(options ...ChainSelectorsOption) []uint6
166165

167166
for selector, chain := range b.chains {
168167
// Skip if in exclusion list
169-
excluded := false
170-
for _, exclude := range opts.excluding {
171-
if selector == exclude {
172-
excluded = true
173-
break
174-
}
175-
}
176-
if excluded {
168+
if slices.Contains(opts.excluding, selector) {
177169
continue
178170
}
179171

180172
// Apply family filter if specified
181173
if opts.family != "" {
182-
switch chain.(type) {
183-
case evm.Chain:
184-
if opts.family != chain_selectors.FamilyEVM {
185-
continue
186-
}
187-
case solana.Chain:
188-
if opts.family != chain_selectors.FamilySolana {
189-
continue
190-
}
191-
case aptos.Chain:
192-
if opts.family != chain_selectors.FamilyAptos {
193-
continue
194-
}
195-
case sui.Chain:
196-
if opts.family != chain_selectors.FamilySui {
197-
continue
198-
}
199-
case ton.Chain:
200-
if opts.family != chain_selectors.FamilyTon {
201-
continue
202-
}
203-
default:
174+
if opts.family != chain.Family() {
204175
continue
205176
}
206177
}
@@ -209,9 +180,7 @@ func (b BlockChains) ListChainSelectors(options ...ChainSelectorsOption) []uint6
209180
}
210181

211182
// Sort for consistent output
212-
sort.Slice(selectors, func(i, j int) bool {
213-
return selectors[i] < selectors[j]
214-
})
183+
slices.Sort(selectors)
215184

216185
return selectors
217186
}

chain/blockchain_test.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package chain_test
33
import (
44
"testing"
55

6-
chain_selectors "github.com/smartcontractkit/chain-selectors"
76
"github.com/stretchr/testify/assert"
87
"github.com/stretchr/testify/require"
98

9+
chain_selectors "github.com/smartcontractkit/chain-selectors"
10+
1011
"github.com/smartcontractkit/chainlink-deployments-framework/chain"
1112
"github.com/smartcontractkit/chainlink-deployments-framework/chain/aptos"
1213
"github.com/smartcontractkit/chainlink-deployments-framework/chain/evm"
@@ -15,12 +16,12 @@ import (
1516
"github.com/smartcontractkit/chainlink-deployments-framework/chain/ton"
1617
)
1718

18-
var evmChain1 = evm.Chain{Selector: 1}
19-
var evmChain2 = evm.Chain{Selector: 2}
20-
var solanaChain1 = solana.Chain{Selector: 3}
21-
var aptosChain1 = aptos.Chain{Selector: 4}
22-
var suiChain1 = sui.Chain{Selector: 5}
23-
var tonChain1 = ton.Chain{Selector: 6}
19+
var evmChain1 = evm.Chain{Selector: chain_selectors.TEST_90000001.Selector}
20+
var evmChain2 = evm.Chain{Selector: chain_selectors.TEST_90000002.Selector}
21+
var solanaChain1 = solana.Chain{Selector: chain_selectors.TEST_22222222222222222222222222222222222222222222.Selector}
22+
var aptosChain1 = aptos.Chain{Selector: chain_selectors.APTOS_LOCALNET.Selector}
23+
var suiChain1 = sui.Chain{Selector: chain_selectors.SUI_LOCALNET.Selector}
24+
var tonChain1 = ton.Chain{Selector: chain_selectors.TON_LOCALNET.Selector}
2425

2526
func TestNewBlockChains(t *testing.T) {
2627
t.Parallel()
@@ -192,8 +193,9 @@ func TestBlockChainsListChainSelectors(t *testing.T) {
192193
for _, tc := range tests {
193194
t.Run(tc.name, func(t *testing.T) {
194195
t.Parallel()
196+
195197
selectors := chains.ListChainSelectors(tc.options...)
196-
assert.Equal(t, tc.expectedIDs, selectors, tc.description)
198+
assert.ElementsMatch(t, tc.expectedIDs, selectors, tc.description)
197199
})
198200
}
199201
}

chain/evm/evm_chain.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,8 @@ func (c Chain) String() string {
5555
func (c Chain) Name() string {
5656
return chain_common.ChainMetadata{Selector: c.Selector}.Name()
5757
}
58+
59+
// Family returns the family of the chain
60+
func (c Chain) Family() string {
61+
return chain_common.ChainMetadata{Selector: c.Selector}.Family()
62+
}

chain/evm/evm_chain_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,28 @@ func TestChain_ChainInfot(t *testing.T) {
1717
selector uint64
1818
wantName string
1919
wantString string
20+
wantFamily string
2021
}{
2122
{
2223
name: "returns correct info",
2324
selector: chain_selectors.ETHEREUM_MAINNET.Selector,
2425
wantString: "ethereum-mainnet (5009297550715157269)",
2526
wantName: chain_selectors.ETHEREUM_MAINNET.Name,
27+
wantFamily: chain_selectors.FamilyEVM,
2628
},
2729
}
2830

2931
for _, tt := range tests {
3032
t.Run(tt.name, func(t *testing.T) {
3133
t.Parallel()
3234

33-
provider := evm.Chain{
35+
c := evm.Chain{
3436
Selector: tt.selector,
3537
}
36-
assert.Equal(t, tt.selector, provider.ChainSelector())
37-
assert.Equal(t, tt.wantString, provider.String())
38-
assert.Equal(t, tt.wantName, provider.Name())
38+
assert.Equal(t, tt.selector, c.ChainSelector())
39+
assert.Equal(t, tt.wantString, c.String())
40+
assert.Equal(t, tt.wantName, c.Name())
41+
assert.Equal(t, tt.wantFamily, c.Family())
3942
})
4043
}
4144
}

chain/internal/common/chain_metadata.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"strconv"
66

7+
chain_selectors "github.com/smartcontractkit/chain-selectors"
8+
79
"github.com/smartcontractkit/chainlink-deployments-framework/chain/utils"
810
)
911

@@ -39,3 +41,13 @@ func (c ChainMetadata) Name() string {
3941

4042
return chainInfo.ChainName
4143
}
44+
45+
// Family returns the family of the chain
46+
func (c ChainMetadata) Family() string {
47+
family, err := chain_selectors.GetSelectorFamily(c.Selector)
48+
if err != nil {
49+
return ""
50+
}
51+
52+
return family
53+
}

chain/internal/common/chain_metadata_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ func TestChainInfoProvider(t *testing.T) {
1717
selector uint64
1818
wantName string
1919
wantString string
20+
wantFamily string
2021
}{
2122
{
2223
name: "returns correct info",
2324
selector: chain_selectors.ETHEREUM_MAINNET.Selector,
2425
wantString: "ethereum-mainnet (5009297550715157269)",
2526
wantName: chain_selectors.ETHEREUM_MAINNET.Name,
27+
wantFamily: chain_selectors.FamilyEVM,
2628
},
2729
{
2830
name: "returns empty for unknown chain",
@@ -36,12 +38,13 @@ func TestChainInfoProvider(t *testing.T) {
3638
t.Run(tt.name, func(t *testing.T) {
3739
t.Parallel()
3840

39-
provider := common.ChainMetadata{
41+
c := common.ChainMetadata{
4042
Selector: tt.selector,
4143
}
42-
assert.Equal(t, tt.selector, provider.ChainSelector())
43-
assert.Equal(t, tt.wantString, provider.String())
44-
assert.Equal(t, tt.wantName, provider.Name())
44+
assert.Equal(t, tt.selector, c.ChainSelector())
45+
assert.Equal(t, tt.wantString, c.String())
46+
assert.Equal(t, tt.wantName, c.Name())
47+
assert.Equal(t, tt.wantFamily, c.Family())
4548
})
4649
}
4750
}

chain/solana/solana_chain.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,8 @@ func (c Chain) String() string {
189189
func (c Chain) Name() string {
190190
return common.ChainMetadata{Selector: c.Selector}.Name()
191191
}
192+
193+
// Family returns the family of the chain
194+
func (c Chain) Family() string {
195+
return common.ChainMetadata{Selector: c.Selector}.Family()
196+
}

0 commit comments

Comments
 (0)