Use accounts[1] for Lua code and tx userdata as arg data
This makes the Lua version nearly identical to the C one.
This commit is contained in:
@ -29,8 +29,12 @@ fn update_accounts(lua: &Lua, name: &str, keyed_accounts: &mut Vec<KeyedAccount>
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_lua(keyed_accounts: &mut Vec<KeyedAccount>, code: &str) -> Result<()> {
|
fn run_lua(keyed_accounts: &mut Vec<KeyedAccount>, code: &str, data: &[u8]) -> Result<()> {
|
||||||
let lua = Lua::new();
|
let lua = Lua::new();
|
||||||
|
let globals = lua.globals();
|
||||||
|
let data_str = lua.create_string(data)?;
|
||||||
|
globals.set("data", data_str)?;
|
||||||
|
|
||||||
set_accounts(&lua, "accounts", keyed_accounts)?;
|
set_accounts(&lua, "accounts", keyed_accounts)?;
|
||||||
lua.exec::<_, ()>(code, None)?;
|
lua.exec::<_, ()>(code, None)?;
|
||||||
update_accounts(&lua, "accounts", keyed_accounts)
|
update_accounts(&lua, "accounts", keyed_accounts)
|
||||||
@ -38,8 +42,8 @@ fn run_lua(keyed_accounts: &mut Vec<KeyedAccount>, code: &str) -> Result<()> {
|
|||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn process(keyed_accounts: &mut Vec<KeyedAccount>, data: &[u8]) {
|
pub extern "C" fn process(keyed_accounts: &mut Vec<KeyedAccount>, data: &[u8]) {
|
||||||
let code: String = deserialize(&data).unwrap();
|
let code: String = deserialize(&keyed_accounts[0].account.userdata).unwrap();
|
||||||
run_lua(keyed_accounts, &code).unwrap();
|
run_lua(keyed_accounts, &code, data).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -68,7 +72,7 @@ mod tests {
|
|||||||
fn test_credit_with_lua() -> Result<()> {
|
fn test_credit_with_lua() -> Result<()> {
|
||||||
let code = r#"accounts[1].tokens = accounts[1].tokens + 1"#;
|
let code = r#"accounts[1].tokens = accounts[1].tokens + 1"#;
|
||||||
let mut accounts = [(Pubkey::default(), Account::default())];
|
let mut accounts = [(Pubkey::default(), Account::default())];
|
||||||
run_lua(&mut create_keyed_accounts(&mut accounts), code)?;
|
run_lua(&mut create_keyed_accounts(&mut accounts), code, &[])?;
|
||||||
assert_eq!(accounts[0].1.tokens, 1);
|
assert_eq!(accounts[0].1.tokens, 1);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -77,14 +81,14 @@ mod tests {
|
|||||||
fn test_error_with_lua() {
|
fn test_error_with_lua() {
|
||||||
let code = r#"accounts[1].tokens += 1"#;
|
let code = r#"accounts[1].tokens += 1"#;
|
||||||
let mut accounts = [(Pubkey::default(), Account::default())];
|
let mut accounts = [(Pubkey::default(), Account::default())];
|
||||||
assert!(run_lua(&mut create_keyed_accounts(&mut accounts), code).is_err());
|
assert!(run_lua(&mut create_keyed_accounts(&mut accounts), code, &[]).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_move_funds_with_lua_via_process() {
|
fn test_move_funds_with_lua_via_process() {
|
||||||
let data: Vec<u8> = serialize(
|
let userdata: Vec<u8> = serialize(
|
||||||
r#"
|
r#"
|
||||||
local tokens = 100
|
local tokens, _ = string.unpack("I", data)
|
||||||
accounts[1].tokens = accounts[1].tokens - tokens
|
accounts[1].tokens = accounts[1].tokens - tokens
|
||||||
accounts[2].tokens = accounts[2].tokens + tokens
|
accounts[2].tokens = accounts[2].tokens + tokens
|
||||||
"#,
|
"#,
|
||||||
@ -95,12 +99,23 @@ mod tests {
|
|||||||
let program_id = Pubkey::default();
|
let program_id = Pubkey::default();
|
||||||
|
|
||||||
let mut accounts = [
|
let mut accounts = [
|
||||||
(alice_pubkey, Account::new(100, 0, program_id)),
|
(
|
||||||
|
alice_pubkey,
|
||||||
|
Account {
|
||||||
|
tokens: 100,
|
||||||
|
userdata,
|
||||||
|
program_id,
|
||||||
|
},
|
||||||
|
),
|
||||||
(bob_pubkey, Account::new(1, 0, program_id)),
|
(bob_pubkey, Account::new(1, 0, program_id)),
|
||||||
];
|
];
|
||||||
|
let data = serialize(&10).unwrap();
|
||||||
process(&mut create_keyed_accounts(&mut accounts), &data);
|
process(&mut create_keyed_accounts(&mut accounts), &data);
|
||||||
|
assert_eq!(accounts[0].1.tokens, 90);
|
||||||
|
assert_eq!(accounts[1].1.tokens, 11);
|
||||||
|
|
||||||
assert_eq!(accounts[0].1.tokens, 0);
|
process(&mut create_keyed_accounts(&mut accounts), &data);
|
||||||
assert_eq!(accounts[1].1.tokens, 101);
|
assert_eq!(accounts[0].1.tokens, 80);
|
||||||
|
assert_eq!(accounts[1].1.tokens, 21);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user