Skip to content

Commit 82a139d

Browse files
ecPabloCopilot
andauthored
chore: port evm state and link views [CLD-1911] (#7)
* feat: port evm state and link views * fix: remove unused function, will be ported in graham's PR * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: update contract types imports * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: go mod * fix: unit tests * fix: move views into pkg/contracts --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
1 parent 99279f1 commit 82a139d

10 files changed

Lines changed: 601 additions & 4 deletions

File tree

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ require (
99
github.com/gagliardetto/solana-go v1.13.0
1010
github.com/smartcontractkit/ccip-owner-contracts v0.1.0
1111
github.com/smartcontractkit/chain-selectors v1.0.97
12+
github.com/smartcontractkit/chainlink-common v0.10.1-0.20260217160002-b56cb5356cc7
1213
github.com/smartcontractkit/chainlink-deployments-framework v0.98.0
14+
github.com/smartcontractkit/chainlink-evm v0.3.3
15+
github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260421142741-9c7fbaf7c828
1316
github.com/smartcontractkit/mcms v0.40.1
1417
github.com/stretchr/testify v1.11.1
1518
gopkg.in/yaml.v3 v3.0.1
@@ -209,7 +212,6 @@ require (
209212
github.com/smartcontractkit/chainlink-aptos v0.0.0-20260306142855-8d629e752265 // indirect
210213
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260121163256-85accaf3d28d // indirect
211214
github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 // indirect
212-
github.com/smartcontractkit/chainlink-common v0.10.1-0.20260217160002-b56cb5356cc7 // indirect
213215
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 // indirect
214216
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260226130359-963f935e0396 // indirect
215217
github.com/smartcontractkit/chainlink-protos/job-distributor v0.18.0 // indirect

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
633633
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
634634
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
635635
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
636-
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
637-
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
636+
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
637+
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
638638
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
639639
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
640640
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
@@ -746,6 +746,10 @@ github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9
746746
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY=
747747
github.com/smartcontractkit/chainlink-deployments-framework v0.98.0 h1:Ov/KOEtubOHXX8oa9UtARhHmkQNCOIjWNt+Zi0AuzHM=
748748
github.com/smartcontractkit/chainlink-deployments-framework v0.98.0/go.mod h1:24dwRW1PYolrlxSth///ddG3auGqR+50xaJiXfUHhkg=
749+
github.com/smartcontractkit/chainlink-evm v0.3.3 h1:JqwyJEtnNEUaoQQPoOBTT4sn2lpdIZHtf0Hr0M60YDw=
750+
github.com/smartcontractkit/chainlink-evm v0.3.3/go.mod h1:q0ZBvaoisNaqC8NcMYWNPTjee88nQktDEeJMQHq3hVI=
751+
github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260421142741-9c7fbaf7c828 h1:BmsFk/TSHL6dPPR86GTqgSrUXLSINNFC6cfpFRrQX+4=
752+
github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260421142741-9c7fbaf7c828/go.mod h1:a260YnLyWq2NHLUN5cSVyMGk9nhO6RguCaTI2rsVqyA=
749753
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260226130359-963f935e0396 h1:03tbcwjyIEjvHba1IWOj1sfThwebm2XNzyFHSuZtlWc=
750754
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260226130359-963f935e0396/go.mod h1:Jqt53s27Tr0jDl8mdBXg1xhu6F8Fci8JOuq43tgHOM8=
751755
github.com/smartcontractkit/chainlink-protos/job-distributor v0.18.0 h1:q+VDPcxWrj5k9QizSYfUOSMnDH3Sd5HvbPguZOgfXTY=

pkg/common/types.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package common
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
7+
"github.com/ethereum/go-ethereum/common"
8+
)
9+
10+
type ContractMetaData struct {
11+
TypeAndVersion string `json:"typeAndVersion,omitempty"`
12+
Address common.Address `json:"address,omitempty"`
13+
Owner common.Address `json:"owner,omitempty"`
14+
}
15+
16+
func NewContractMetaData(tv Meta, addr common.Address) (ContractMetaData, error) {
17+
tvStr, err := tv.TypeAndVersion(nil)
18+
if err != nil {
19+
return ContractMetaData{}, fmt.Errorf("failed to get type and version addr %s: %w", addr.String(), err)
20+
}
21+
owner, err := tv.Owner(nil)
22+
if err != nil {
23+
return ContractMetaData{}, fmt.Errorf("failed to get owner addr %s: %w", addr.String(), err)
24+
}
25+
26+
return ContractMetaData{
27+
TypeAndVersion: tvStr,
28+
Address: addr,
29+
Owner: owner,
30+
}, nil
31+
}
32+
33+
type Meta interface {
34+
TypeAndVersion(opts *bind.CallOpts) (string, error)
35+
Owner(opts *bind.CallOpts) (common.Address, error)
36+
}

pkg/common/version.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package common
2+
3+
import (
4+
"github.com/Masterminds/semver/v3"
5+
)
6+
7+
var (
8+
Version0_5_0 = *semver.MustParse("0.5.0")
9+
Version1_0_0 = *semver.MustParse("1.0.0")
10+
Version1_1_0 = *semver.MustParse("1.1.0")
11+
Version1_2_0 = *semver.MustParse("1.2.0")
12+
Version1_5_0 = *semver.MustParse("1.5.0")
13+
Version1_5_1 = *semver.MustParse("1.5.1")
14+
Version1_6_0 = *semver.MustParse("1.6.0")
15+
Version1_6_1 = *semver.MustParse("1.6.1")
16+
Version1_6_1Dev = *semver.MustParse("1.6.1-dev")
17+
Version1_6_2 = *semver.MustParse("1.6.2")
18+
Version1_6_3Dev = *semver.MustParse("1.6.3-dev")
19+
Version1_6_3 = *semver.MustParse("1.6.3")
20+
Version1_7_0 = *semver.MustParse("1.7.0")
21+
)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package v1_0
2+
3+
import (
4+
"fmt"
5+
"math/big"
6+
7+
"github.com/ethereum/go-ethereum/common"
8+
linkcontracts "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/contracts/link"
9+
10+
"github.com/smartcontractkit/chainlink-evm/gethwrappers/shared/generated/initial/link_token"
11+
12+
cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
13+
14+
cldchangesetscommon "github.com/smartcontractkit/cld-changesets/pkg/common"
15+
)
16+
17+
type LinkTokenView struct {
18+
cldchangesetscommon.ContractMetaData
19+
Decimals uint8 `json:"decimals"`
20+
Supply *big.Int `json:"supply"`
21+
Minters []common.Address `json:"minters"`
22+
Burners []common.Address `json:"burners"`
23+
}
24+
25+
func GenerateLinkTokenView(lt *link_token.LinkToken) (LinkTokenView, error) {
26+
owner, err := lt.Owner(nil)
27+
if err != nil {
28+
owner = common.Address{}
29+
}
30+
decimals, err := lt.Decimals(nil)
31+
if err != nil {
32+
return LinkTokenView{}, fmt.Errorf("failed to get decimals %s: %w", lt.Address(), err)
33+
}
34+
totalSupply, err := lt.TotalSupply(nil)
35+
if err != nil {
36+
return LinkTokenView{}, fmt.Errorf("failed to get total supply %s: %w", lt.Address(), err)
37+
}
38+
minters, err := lt.GetMinters(nil)
39+
if err != nil {
40+
minters = []common.Address{}
41+
}
42+
burners, err := lt.GetBurners(nil)
43+
if err != nil {
44+
burners = []common.Address{}
45+
}
46+
47+
return LinkTokenView{
48+
ContractMetaData: cldchangesetscommon.ContractMetaData{
49+
TypeAndVersion: cldf.TypeAndVersion{
50+
Type: linkcontracts.LinkToken,
51+
Version: cldchangesetscommon.Version1_0_0,
52+
}.String(),
53+
Address: lt.Address(),
54+
Owner: owner,
55+
},
56+
Decimals: decimals,
57+
Supply: totalSupply,
58+
Minters: minters,
59+
Burners: burners,
60+
}, nil
61+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package v1_0
2+
3+
import (
4+
"math/big"
5+
"testing"
6+
7+
chainselectors "github.com/smartcontractkit/chain-selectors"
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
12+
13+
"github.com/smartcontractkit/chainlink-evm/gethwrappers/shared/generated/initial/link_token"
14+
15+
cldf_evm "github.com/smartcontractkit/chainlink-deployments-framework/chain/evm"
16+
"github.com/smartcontractkit/chainlink-deployments-framework/engine/test/environment"
17+
)
18+
19+
func TestLinkTokenView(t *testing.T) {
20+
t.Parallel()
21+
22+
selector := chainselectors.TEST_90000001.Selector
23+
env, err := environment.New(t.Context(),
24+
environment.WithEVMSimulated(t, []uint64{selector}),
25+
)
26+
require.NoError(t, err)
27+
28+
chain := env.BlockChains.EVMChains()[selector]
29+
_, tx, lt, err := link_token.DeployLinkToken(chain.DeployerKey, chain.Client)
30+
require.NoError(t, err)
31+
_, err = chain.Confirm(tx)
32+
require.NoError(t, err)
33+
34+
testLinkTokenViewWithChain(t, chain, lt)
35+
}
36+
37+
func TestLinkTokenViewZk(t *testing.T) {
38+
// Timeouts in CI
39+
tests.SkipFlakey(t, "https://smartcontract-it.atlassian.net/browse/CCIP-6427")
40+
t.Parallel()
41+
42+
selector := chainselectors.TEST_90000050.Selector
43+
env, err := environment.New(t.Context(),
44+
environment.WithZKSyncContainer(t, []uint64{selector}),
45+
)
46+
require.NoError(t, err)
47+
48+
chain := env.BlockChains.EVMChains()[selector]
49+
_, _, lt, err := link_token.DeployLinkTokenZk(nil, chain.ClientZkSyncVM, chain.DeployerKeyZkSyncVM, chain.Client)
50+
require.NoError(t, err)
51+
52+
testLinkTokenViewWithChain(t, chain, lt)
53+
}
54+
55+
func testLinkTokenViewWithChain(t *testing.T, chain cldf_evm.Chain, lt *link_token.LinkToken) {
56+
t.Helper()
57+
58+
v, err := GenerateLinkTokenView(lt)
59+
require.NoError(t, err)
60+
61+
assert.Equal(t, v.Owner, chain.DeployerKey.From)
62+
assert.Equal(t, "LinkToken 1.0.0", v.TypeAndVersion)
63+
assert.Equal(t, uint8(18), v.Decimals)
64+
// Initially nothing minted and no minters/burners.
65+
assert.Equal(t, "0", v.Supply.String())
66+
require.Empty(t, v.Minters)
67+
require.Empty(t, v.Burners)
68+
69+
// Add some minters
70+
tx, err := lt.GrantMintAndBurnRoles(chain.DeployerKey, chain.DeployerKey.From)
71+
require.NoError(t, err)
72+
_, err = chain.Confirm(tx)
73+
require.NoError(t, err)
74+
tx, err = lt.Mint(chain.DeployerKey, chain.DeployerKey.From, big.NewInt(100))
75+
require.NoError(t, err)
76+
_, err = chain.Confirm(tx)
77+
require.NoError(t, err)
78+
79+
v, err = GenerateLinkTokenView(lt)
80+
require.NoError(t, err)
81+
82+
assert.Equal(t, "100", v.Supply.String())
83+
require.Len(t, v.Minters, 1)
84+
require.Equal(t, v.Minters[0].String(), chain.DeployerKey.From.String())
85+
require.Len(t, v.Burners, 1)
86+
require.Equal(t, v.Burners[0].String(), chain.DeployerKey.From.String())
87+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package v1_0
2+
3+
import (
4+
"fmt"
5+
"math/big"
6+
7+
linkcontracts "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/contracts/link"
8+
"github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/link_token_interface"
9+
10+
cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
11+
12+
"github.com/smartcontractkit/cld-changesets/pkg/common"
13+
)
14+
15+
type StaticLinkTokenView struct {
16+
common.ContractMetaData
17+
Decimals uint8 `json:"decimals"`
18+
Supply *big.Int `json:"supply"`
19+
}
20+
21+
func GenerateStaticLinkTokenView(lt *link_token_interface.LinkToken) (StaticLinkTokenView, error) {
22+
decimals, err := lt.Decimals(nil)
23+
if err != nil {
24+
return StaticLinkTokenView{}, fmt.Errorf("failed to get decimals %s: %w", lt.Address(), err)
25+
}
26+
totalSupply, err := lt.TotalSupply(nil)
27+
if err != nil {
28+
return StaticLinkTokenView{}, fmt.Errorf("failed to get total supply %s: %w", lt.Address(), err)
29+
}
30+
31+
return StaticLinkTokenView{
32+
ContractMetaData: common.ContractMetaData{
33+
TypeAndVersion: cldf.TypeAndVersion{
34+
Type: linkcontracts.StaticLinkToken,
35+
Version: common.Version1_0_0,
36+
}.String(),
37+
Address: lt.Address(),
38+
// No owner.
39+
},
40+
Decimals: decimals,
41+
Supply: totalSupply,
42+
}, nil
43+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package v1_0
2+
3+
import (
4+
"testing"
5+
6+
"github.com/ethereum/go-ethereum/common"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
11+
chain_selectors "github.com/smartcontractkit/chain-selectors"
12+
13+
"github.com/smartcontractkit/chainlink-deployments-framework/engine/test/environment"
14+
15+
"github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/link_token_interface"
16+
)
17+
18+
func TestStaticLinkTokenView(t *testing.T) {
19+
t.Parallel()
20+
21+
selector := chain_selectors.TEST_90000001.Selector
22+
env, err := environment.New(t.Context(),
23+
environment.WithEVMSimulated(t, []uint64{selector}),
24+
)
25+
require.NoError(t, err)
26+
27+
chain := env.BlockChains.EVMChains()[selector]
28+
_, tx, lt, err := link_token_interface.DeployLinkToken(chain.DeployerKey, chain.Client)
29+
require.NoError(t, err)
30+
_, err = chain.Confirm(tx)
31+
require.NoError(t, err)
32+
v, err := GenerateStaticLinkTokenView(lt)
33+
require.NoError(t, err)
34+
35+
assert.Equal(t, v.Owner, common.HexToAddress("0x0")) // Ownerless
36+
assert.Equal(t, "StaticLinkToken 1.0.0", v.TypeAndVersion)
37+
assert.Equal(t, uint8(18), v.Decimals)
38+
assert.Equal(t, "1000000000000000000000000000", v.Supply.String())
39+
}

0 commit comments

Comments
 (0)