Documentation Index Fetch the complete documentation index at: https://docs.magicblock.gg/llms.txt
Use this file to discover all available pages before exploring further.
快速访问
Magic Actions Example 在 GitHub 上查看参考实现
1) 创建 action 指令
update_leaderboard 指令会在提交完成后立即于基础层执行。其账户上下文上的 #[action] 属性将其标记为可由提交后 action 调用。
// program instruction
pub fn update_leaderboard ( ctx : Context < UpdateLeaderboard >) -> Result <()> {
let leaderboard = & mut ctx . accounts . leaderboard;
let counter_info = & mut ctx . accounts . counter . to_account_info ();
let mut data : & [ u8 ] = & counter_info . try_borrow_data () ? ;
let counter = Counter :: try_deserialize ( & mut data ) ? ;
if counter . count > leaderboard . high_score {
leaderboard . high_score = counter . count;
}
msg! (
"Leaderboard updated! High score: {}" ,
leaderboard . high_score
);
Ok (())
}
// instruction context
#[action]
#[derive( Accounts )]
pub struct UpdateLeaderboard <' info > {
#[account( mut , seeds = [ LEADERBOARD_SEED ], bump )]
pub leaderboard : Account <' info , Leaderboard >,
/// CHECK: PDA owner depends on: 1) Delegated: Delegation Program; 2) Undelegated: Your program ID
pub counter : UncheckedAccount <' info >,
}
2) 构建带有 action 的提交指令
commit_and_update_leaderboard 提交指令在 ER 上运行。它使用 MagicIntentBundleBuilder 将提交和提交后 action 一起调度到 magic_context 上 —— 当 ER 交易回到基础层完成结算时,两者会一起被应用。
// commit action instruction on ER
pub fn commit_and_update_leaderboard ( ctx : Context < CommitAndUpdateLeaderboard >) -> Result <()> {
// Build the post-commit action that updates the leaderboard on base layer
let instruction_data =
anchor_lang :: InstructionData :: data ( & crate :: instruction :: UpdateLeaderboard {});
let action_args = ActionArgs :: new ( instruction_data );
let action_accounts = vec! [
ShortAccountMeta {
pubkey : ctx . accounts . leaderboard . key (),
is_writable : true ,
},
ShortAccountMeta {
pubkey : ctx . accounts . counter . key (),
is_writable : false ,
},
];
let action = CallHandler {
destination_program : crate :: ID ,
accounts : action_accounts ,
args : action_args ,
// Signer that pays transaction fees for the action from its escrow PDA
escrow_authority : ctx . accounts . payer . to_account_info (),
compute_units : 200_000 ,
};
// Schedule commit + post-commit action on magic_context
MagicIntentBundleBuilder :: new (
ctx . accounts . payer . to_account_info (),
ctx . accounts . magic_context . to_account_info (),
ctx . accounts . magic_program . to_account_info (),
)
. commit ( & [ ctx . accounts . counter . to_account_info ()])
. add_post_commit_actions ([ action ])
. build_and_invoke () ? ;
Ok (())
}
// commit action context on ER
#[commit]
#[derive( Accounts )]
pub struct CommitAndUpdateLeaderboard <' info > {
#[account( mut )]
pub payer : Signer <' info >,
#[account( mut , seeds = [ COUNTER_SEED ], bump )]
pub counter : Account <' info , Counter >,
/// CHECK: Leaderboard PDA - not mut here, writable set in handler
#[account(seeds = [ LEADERBOARD_SEED ], bump )]
pub leaderboard : UncheckedAccount <' info >,
/// CHECK: Your program ID
pub program_id : AccountInfo <' info >,
}
执行多个 action
你可以一次提交多个账户并串联多个 action。Action 按其传入 add_post_commit_actions 的顺序依次执行。
// Chain several actions — they execute sequentially on base layer after the commit lands.
MagicIntentBundleBuilder :: new (
ctx . accounts . payer . to_account_info (),
ctx . accounts . magic_context . to_account_info (),
ctx . accounts . magic_program . to_account_info (),
)
. commit ( & [
ctx . accounts . counter . to_account_info (),
// ... additional committed accounts
])
. add_post_commit_actions ([ action_1 , action_2 , action_3 ])
. build_and_invoke () ? ;
解除委托时执行 action
Action 也可以串联到解除委托上 —— counter 提交、解除委托以及 action 全部在同一个 ER 交易中原子地执行。
// Commit, undelegate, AND execute actions — all atomically on base layer after the ER transaction seals.
MagicIntentBundleBuilder :: new (
ctx . accounts . payer . to_account_info (),
ctx . accounts . magic_context . to_account_info (),
ctx . accounts . magic_program . to_account_info (),
)
. commit_and_undelegate ( & [ ctx . accounts . counter . to_account_info ()])
. add_post_commit_actions ([ action ])
. build_and_invoke () ? ;