Executing Proposals
Here is an example of how to run SetRoot and Execute on a signed proposal.
package examples
import (
"context"
"log"
"os"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/gagliardetto/solana-go"
"github.com/gagliardetto/solana-go/rpc"
chain_selectors "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/mcms"
"github.com/smartcontractkit/mcms/sdk"
"github.com/smartcontractkit/mcms/sdk/evm"
mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana"
"github.com/smartcontractkit/mcms/types"
)
func main() {
// Step 1: Load the Proposal
ctx := context.Background()
file, err := os.Open("proposal.json")
if err != nil {
log.Fatalf("Error opening proposal file: %v", err)
return
}
defer file.Close()
proposal, err := mcms.NewProposal(file)
if err != nil {
log.Fatalf("Error opening proposal file: %v", err)
return
}
// Step 2: Initialize the Chain Family Executors
evmSelector := chain_selectors.ETHEREUM_TESTNET_SEPOLIA.Selector
solanaSelector := chain_selectors.SOLANA_DEVNET.Selector
// EVM executor
backend := backends.SimulatedBackend{}
evmExecutor := evm.NewExecutor(evm.NewEncoder(types.ChainSelector(evmSelector), 0, false, false), backend, nil)
// Solana executor
client := rpc.New("https://api.devnet.solana.com")
solanaKey, err := solana.NewRandomPrivateKey()
if err != nil {
log.Fatalf("Error creating solana key: %v", err)
return
}
encoder := mcmsSolana.NewEncoder(types.ChainSelector(solanaSelector), 0, false)
solanaExecutor := mcmsSolana.NewExecutor(client, solanaKey, encoder)
// Build executors map
executorsMap := map[types.ChainSelector]sdk.Executor{
types.ChainSelector(evmSelector): evmExecutor,
types.ChainSelector(solanaSelector): solanaExecutor,
}
// Step 3: Create the chain MCMS proposal executor
executable, err := mcms.NewExecutable(proposal, executorsMap)
if err != nil {
log.Fatalf("Error opening proposal file: %v", err)
}
// Step 4: SetRoot of a proposal
// On EVM
_, err = executable.SetRoot(ctx, types.ChainSelector(evmSelector))
if err != nil {
log.Fatalf("Error calling set root: %v", err)
}
// On Solana
_, err = executable.SetRoot(ctx, types.ChainSelector(solanaSelector))
if err != nil {
log.Fatalf("Error calling set root: %v", err)
}
// Step 5: Execute the first operation of the proposal.
_, err = executable.Execute(ctx, 0)
if err != nil {
log.Fatalf("Error calling execute: %v", err)
}
}