diff --git a/.github/workflows/push-tag-release.yml b/.github/workflows/push-tag-release.yml index a2b1e9d..2809e8c 100644 --- a/.github/workflows/push-tag-release.yml +++ b/.github/workflows/push-tag-release.yml @@ -25,17 +25,3 @@ jobs: goreleaser-version: '~> v2' goreleaser-dist: goreleaser-pro goreleaser-key: ${{ secrets.GORELEASER_KEY }} - -# todo: enable once i have the secret setup (pending security ticket) -# - name: Set tag for Slack notification -# run: echo "TAG=${{ github.ref_name }}" >> "$GITHUB_ENV" -# shell: bash -# -# - name: Notify Slack -# uses: smartcontractkit/.github/actions/slack-notify-git-ref@eeb76b5870e3c17856d5a60fd064a053c023b5f5 # slack-notify-git-ref@1.0.0 -# with: -# slack-channel-id: ${{ secrets.SLACK_CHANNEL_CLDF}} -# slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN_RELENG }} # Releng Bot -# git-ref: ${{ env.TAG }} -# git-ref-type: tag -# changelog-url: 'https://github.com/${{ github.repository }}/releases/tag/${{ env.TAG }}' diff --git a/deployment/aptos_chain.go b/deployment/aptos_chain.go new file mode 100644 index 0000000..a10b34b --- /dev/null +++ b/deployment/aptos_chain.go @@ -0,0 +1,13 @@ +package deployment + +import ( + "github.com/aptos-labs/aptos-go-sdk" +) + +// AptosChain represents an Aptos chain. +type AptosChain struct { + Selector uint64 + Client aptos.AptosRpcClient + DeployerSigner aptos.TransactionSigner + URL string +} diff --git a/deployment/environment.go b/deployment/environment.go index 61ae8b6..8af3e40 100644 --- a/deployment/environment.go +++ b/deployment/environment.go @@ -5,9 +5,11 @@ import ( "errors" "fmt" "math/big" + "strconv" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" csav1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa" jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" @@ -24,6 +26,7 @@ type OnchainClient interface { NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) } + // OffchainClient interacts with the job-distributor // which is a family agnostic interface for performing // DON operations. @@ -33,6 +36,40 @@ type OffchainClient interface { csav1.CSAServiceClient } +// Chain represents an EVM chain. +type Chain struct { + // Selectors used as canonical chain identifier. + Selector uint64 + Client OnchainClient + // Note the Sign function can be abstract supporting a variety of key storage mechanisms (e.g. KMS etc). + DeployerKey *bind.TransactOpts + Confirm func(tx *types.Transaction) (uint64, error) + // Users are a set of keys that can be used to interact with the chain. + // These are distinct from the deployer key. + Users []*bind.TransactOpts +} + +func (c Chain) String() string { + chainInfo, err := ChainInfo(c.Selector) + if err != nil { + // we should never get here, if the selector is invalid it should not be in the environment + panic(err) + } + return fmt.Sprintf("%s (%d)", chainInfo.ChainName, chainInfo.ChainSelector) +} + +func (c Chain) Name() string { + chainInfo, err := ChainInfo(c.Selector) + if err != nil { + // we should never get here, if the selector is invalid it should not be in the environment + panic(err) + } + if chainInfo.ChainName == "" { + return strconv.FormatUint(c.Selector, 10) + } + return chainInfo.ChainName +} + func MaybeDataErr(err error) error { //revive:disable var d rpc.DataError diff --git a/deployment/helpers.go b/deployment/helpers.go new file mode 100644 index 0000000..d103ad7 --- /dev/null +++ b/deployment/helpers.go @@ -0,0 +1,19 @@ +package deployment + +import chain_selectors "github.com/smartcontractkit/chain-selectors" + +func ChainInfo(cs uint64) (chain_selectors.ChainDetails, error) { + id, err := chain_selectors.GetChainIDFromSelector(cs) + if err != nil { + return chain_selectors.ChainDetails{}, err + } + family, err := chain_selectors.GetSelectorFamily(cs) + if err != nil { + return chain_selectors.ChainDetails{}, err + } + info, err := chain_selectors.GetChainDetailsByChainIDAndFamily(id, family) + if err != nil { + return chain_selectors.ChainDetails{}, err + } + return info, nil +} diff --git a/deployment/solana_chain.go b/deployment/solana_chain.go new file mode 100644 index 0000000..5ee06de --- /dev/null +++ b/deployment/solana_chain.go @@ -0,0 +1,178 @@ +package deployment + +import ( + "bytes" + "context" + "fmt" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/gagliardetto/solana-go" + solRpc "github.com/gagliardetto/solana-go/rpc" + "github.com/pkg/errors" + + "github.com/gagliardetto/solana-go/rpc" + + solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + "github.com/smartcontractkit/chainlink-common/pkg/logger" +) + +const ( + ProgramIDPrefix = "Program Id: " + BufferIDPrefix = "Buffer: " + SolDefaultCommitment = rpc.CommitmentConfirmed + RouterProgramName = "ccip_router" + OffRampProgramName = "ccip_offramp" + FeeQuoterProgramName = "fee_quoter" + BurnMintTokenPoolProgramName = "burnmint_token_pool" + LockReleaseTokenPoolProgramName = "lockrelease_token_pool" + AccessControllerProgramName = "access_controller" + TimelockProgramName = "timelock" + McmProgramName = "mcm" + RMNRemoteProgramName = "rmn_remote" + ReceiverProgramName = "test_ccip_receiver" +) + +// SolChain represents a Solana chain. +type SolChain struct { + // Selectors used as canonical chain identifier. + Selector uint64 + // RPC client + Client *solRpc.Client + URL string + WSURL string + // TODO: raw private key for now, need to replace with a more secure way + DeployerKey *solana.PrivateKey + Confirm func(instructions []solana.Instruction, opts ...solCommonUtil.TxModifier) error + + // deploy uses the solana CLI which needs a keyfile + KeypairPath string + ProgramsPath string +} + +func (c SolChain) String() string { + chainInfo, err := ChainInfo(c.Selector) + if err != nil { + // we should never get here, if the selector is invalid it should not be in the environment + panic(err) + } + return fmt.Sprintf("%s (%d)", chainInfo.ChainName, chainInfo.ChainSelector) +} + +func (c SolChain) Name() string { + chainInfo, err := ChainInfo(c.Selector) + if err != nil { + // we should never get here, if the selector is invalid it should not be in the environment + panic(err) + } + if chainInfo.ChainName == "" { + return strconv.FormatUint(c.Selector, 10) + } + return chainInfo.ChainName +} + +// https://docs.google.com/document/d/1Fk76lOeyS2z2X6MokaNX_QTMFAn5wvSZvNXJluuNV1E/edit?tab=t.0#heading=h.uij286zaarkz +// https://docs.google.com/document/d/1nCNuam0ljOHiOW0DUeiZf4ntHf_1Bw94Zi7ThPGoKR4/edit?tab=t.0#heading=h.hju45z55bnqd +func GetSolanaProgramBytes() map[string]int { + return map[string]int{ + RouterProgramName: 5 * 1024 * 1024, + OffRampProgramName: 1.5 * 1024 * 1024, // router should be redeployed but it does support upgrades if required (big fixes etc.) + FeeQuoterProgramName: 5 * 1024 * 1024, + BurnMintTokenPoolProgramName: 3 * 1024 * 1024, + LockReleaseTokenPoolProgramName: 3 * 1024 * 1024, + AccessControllerProgramName: 1 * 1024 * 1024, + TimelockProgramName: 1 * 1024 * 1024, + McmProgramName: 1 * 1024 * 1024, + RMNRemoteProgramName: 3 * 1024 * 1024, + } +} + +func (c SolChain) DeployProgram(logger logger.Logger, programName string, isUpgrade bool) (string, error) { + programFile := filepath.Join(c.ProgramsPath, programName+".so") + if _, err := os.Stat(programFile); err != nil { + return "", fmt.Errorf("program file not found: %w", err) + } + programKeyPair := filepath.Join(c.ProgramsPath, programName+"-keypair.json") + + cliCommand := "deploy" + prefix := ProgramIDPrefix + if isUpgrade { + cliCommand = "write-buffer" + prefix = BufferIDPrefix + } + + // Base command with required args + baseArgs := []string{ + "program", cliCommand, + programFile, // .so file + "--keypair", c.KeypairPath, // deployer keypair + "--url", c.URL, // rpc url + "--use-rpc", // use rpc for deployment + } + + var cmd *exec.Cmd + // We need to specify the program ID on the initial deploy but not on upgrades + // Upgrades happen in place so we don't need to supply the keypair + // It will write the .so file to a buffer and then deploy it to the existing keypair + if !isUpgrade { + logger.Infow("Deploying program with existing keypair", + "programFile", programFile, + "programKeyPair", programKeyPair) + baseArgs = append(baseArgs, "--program-id", programKeyPair) + totalBytes := GetSolanaProgramBytes()[programName] + if totalBytes > 0 { + baseArgs = append(baseArgs, "--max-len", strconv.Itoa(totalBytes)) + } + cmd = exec.Command("solana", baseArgs...) // #nosec G204 + } else { + // Keypairs wont be created for devenvs + logger.Infow("Deploying new program", + "programFile", programFile) + cmd = exec.Command("solana", baseArgs...) // #nosec G204 + } + + // Capture the command output + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + // Run the command + if err := cmd.Run(); err != nil { + return "", fmt.Errorf("error deploying program: %s: %s", err.Error(), stderr.String()) + } + + // Parse and return the program ID + output := stdout.String() + + // TODO: obviously need to do this better + time.Sleep(5 * time.Second) + return parseProgramID(output, prefix) +} + +func (c SolChain) GetAccountDataBorshInto(ctx context.Context, pubkey solana.PublicKey, accountState interface{}) error { + err := solCommonUtil.GetAccountDataBorshInto(ctx, c.Client, pubkey, SolDefaultCommitment, accountState) + if err != nil { + return err + } + return nil +} + +// parseProgramID parses the program ID from the deploy output. +func parseProgramID(output string, prefix string) (string, error) { + // Look for the program ID in the CLI output + // Example output: "Program Id: " + startIdx := strings.Index(output, prefix) + if startIdx == -1 { + return "", errors.New("failed to find program ID in output") + } + startIdx += len(prefix) + endIdx := strings.Index(output[startIdx:], "\n") + if endIdx == -1 { + endIdx = len(output) + } + return output[startIdx : startIdx+endIdx], nil +} diff --git a/go.mod b/go.mod index 2e1679d..c501ba9 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,14 @@ go 1.24.1 require ( github.com/Masterminds/semver/v3 v3.3.1 + github.com/aptos-labs/aptos-go-sdk v1.5.0 github.com/avast/retry-go/v4 v4.6.1 github.com/ethereum/go-ethereum v1.15.3 + github.com/gagliardetto/solana-go v1.12.0 github.com/google/uuid v1.6.0 github.com/pkg/errors v0.9.1 github.com/smartcontractkit/chain-selectors v1.0.50 + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250425163923-16aa375957b7 github.com/smartcontractkit/chainlink-common v0.7.0 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 github.com/smartcontractkit/mcms v0.16.1 @@ -18,11 +21,13 @@ require ( ) require ( - filippo.io/edwards25519 v1.0.0-rc.1 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect github.com/bits-and-blooms/bitset v1.17.0 // indirect github.com/blendle/zapdriver v1.3.1 // indirect + github.com/coder/websocket v1.8.12 // indirect github.com/consensys/bavard v0.1.22 // indirect github.com/consensys/gnark-crypto v0.14.0 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect @@ -36,13 +41,14 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/binary v0.8.0 // indirect - github.com/gagliardetto/solana-go v1.12.0 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.24.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/hasura/go-graphql-client v0.13.1 // indirect + github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/uint256 v1.3.2 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect @@ -59,7 +65,6 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250226104101-11778f2ead98 // indirect github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect diff --git a/go.sum b/go.sum index 205bf54..332ff92 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,9 @@ -filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= -filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= @@ -12,6 +14,8 @@ github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjC github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= +github.com/aptos-labs/aptos-go-sdk v1.5.0 h1:QMdYmeqMb/kc/tuKhLiXq4SpJtLLFIaEDLHx0Peg2iU= +github.com/aptos-labs/aptos-go-sdk v1.5.0/go.mod h1:BgddSKFtfWFLK+no8l+AwCcb/Lh1lv74ybYLzeonloo= github.com/avast/retry-go/v4 v4.6.1 h1:VkOLRubHdisGrHnTu89g08aQEWEgRU7LVEop3GbIcMk= github.com/avast/retry-go/v4 v4.6.1/go.mod h1:V6oF8njAwxJ5gRo1Q7Cxab24xs5NCWZBeaHHBklR8mA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -37,6 +41,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= +github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= @@ -47,6 +53,12 @@ github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOV github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo= +github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -98,6 +110,8 @@ github.com/go-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= +github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= @@ -120,6 +134,16 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= +github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= +github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= +github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= @@ -225,8 +249,8 @@ github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/smartcontractkit/chain-selectors v1.0.50 h1:p/1FKI2X/fZqxIHn7P9tlkmSaoYIsTxmPGGkLuWoYy0= github.com/smartcontractkit/chain-selectors v1.0.50/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250226104101-11778f2ead98 h1:uHdawaiGBA3Xmju92tzbQ2SwsG2DDVJS5E+Jm5QnsQg= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250226104101-11778f2ead98/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250425163923-16aa375957b7 h1:j6Vo/NX2ABsPdGxETC5pfQLcz/h6iLJu/Yx+8AhPa34= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250425163923-16aa375957b7/go.mod h1:k3/Z6AvwurPUlfuDFEonRbkkiTSgNSrtVNhJEWNlUZA= github.com/smartcontractkit/chainlink-common v0.7.0 h1:QThOrHKn+du8CTmzJPCha0Nwnvw0tonIEAQca+dnmE0= github.com/smartcontractkit/chainlink-common v0.7.0/go.mod h1:pptbsF6z90IGCewkCgDMBxNYjfSOyW9X9l2jzYyQgmk= github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 h1:hfMRj2ny6oNHd8w1rhJHdoX3YkoWJtCkBK6wTlCE4+c= @@ -237,6 +261,8 @@ github.com/smartcontractkit/mcms v0.16.1 h1:8D3/z+H4NF9AQWYBMv3mc6+bFLki0aIjV2Gr github.com/smartcontractkit/mcms v0.16.1/go.mod h1:DyvrOrFD0DwQecfPC8go3fDQzBgZB4L6/Aw32TDTptg= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyirb8anBEtdjtHFIufXdacyTi6i4KBfeNXeo= github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=