Skip to content

Commit 6f733a4

Browse files
committed
clarity: implement "pass_argument_to_wasm" for callables
1 parent 00a7a23 commit 6f733a4

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

clarity/src/vm/clarity_wasm.rs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use super::errors::RuntimeErrorType;
2020
use super::events::*;
2121
use super::functions::crypto::{pubkey_to_address_v1, pubkey_to_address_v2};
2222
use super::types::{
23-
ASCIIData, AssetIdentifier, BlockInfoProperty, BuffData, BurnBlockInfoProperty, CharType,
24-
FixedFunction, FunctionType, ListData, ListTypeData, OptionalData, PrincipalData,
23+
ASCIIData, AssetIdentifier, BlockInfoProperty, BuffData, BurnBlockInfoProperty, CallableData,
24+
CharType, FixedFunction, FunctionType, ListData, ListTypeData, OptionalData, PrincipalData,
2525
QualifiedContractIdentifier, ResponseData, SequenceData, StacksAddressExtensions,
2626
StandardPrincipalData, TraitIdentifier, TupleData, TupleTypeSignature, UTF8Data, BUFF_1,
2727
BUFF_32, BUFF_33,
@@ -1568,29 +1568,39 @@ fn pass_argument_to_wasm(
15681568
buffer.push(Val::I32(written));
15691569
Ok((buffer, offset + written, in_mem_offset + in_mem_written))
15701570
}
1571-
Value::Principal(p) => {
1572-
let bytes: Vec<u8> = match p {
1573-
PrincipalData::Standard(StandardPrincipalData(v, h)) => {
1574-
std::iter::once(v).chain(h.iter()).copied().collect()
1575-
}
1576-
PrincipalData::Contract(QualifiedContractIdentifier {
1577-
issuer: StandardPrincipalData(v, h),
1578-
name,
1579-
}) => std::iter::once(v)
1580-
.chain(h.iter())
1581-
.chain(std::iter::once(&name.len()))
1582-
.chain(name.as_bytes())
1583-
.copied()
1584-
.collect(),
1585-
};
1571+
Value::Principal(PrincipalData::Standard(StandardPrincipalData(v, h))) => {
1572+
let bytes: Vec<u8> = std::iter::once(v).chain(h.iter()).copied().collect();
1573+
let buffer = vec![Val::I32(in_mem_offset), Val::I32(bytes.len() as i32)];
1574+
memory
1575+
.write(&mut store, in_mem_offset as usize, &bytes)
1576+
.map_err(|e| Error::Wasm(WasmError::UnableToWriteMemory(e.into())))?;
1577+
let adjusted_in_mem_offset = in_mem_offset + bytes.len() as i32;
1578+
Ok((buffer, offset, adjusted_in_mem_offset))
1579+
}
1580+
Value::Principal(PrincipalData::Contract(p))
1581+
| Value::CallableContract(CallableData {
1582+
contract_identifier: p,
1583+
..
1584+
}) => {
1585+
// Callable types can just ignore the optional trait identifier, and
1586+
// is handled like a qualified contract
1587+
let QualifiedContractIdentifier {
1588+
issuer: StandardPrincipalData(v, h),
1589+
name,
1590+
} = p;
1591+
let bytes: Vec<u8> = std::iter::once(v)
1592+
.chain(h.iter())
1593+
.chain(std::iter::once(&name.len()))
1594+
.chain(name.as_bytes())
1595+
.copied()
1596+
.collect();
15861597
let buffer = vec![Val::I32(in_mem_offset), Val::I32(bytes.len() as i32)];
15871598
memory
15881599
.write(&mut store, in_mem_offset as usize, &bytes)
15891600
.map_err(|e| Error::Wasm(WasmError::UnableToWriteMemory(e.into())))?;
15901601
let adjusted_in_mem_offset = in_mem_offset + bytes.len() as i32;
15911602
Ok((buffer, offset, adjusted_in_mem_offset))
15921603
}
1593-
Value::CallableContract(_c) => todo!("Value type not yet implemented: {:?}", value),
15941604
Value::Tuple(_t) => todo!("Value type not yet implemented: {:?}", value),
15951605
}
15961606
}

0 commit comments

Comments
 (0)