From 256afe1146955d74a13cf472c018bdf95f559bad Mon Sep 17 00:00:00 2001 From: slash-aech Date: Thu, 16 Jul 2026 19:38:29 +0530 Subject: [PATCH 1/3] Linked support for block.number on soroban Signed-off-by: slash-aech --- src/codegen/mod.rs | 2 ++ src/codegen/targets/soroban/mod.rs | 23 +++++++++++++++ src/emit/soroban/mod.rs | 2 ++ tests/soroban_testcases/block_number.rs | 38 +++++++++++++++++++++++++ tests/soroban_testcases/mod.rs | 1 + 5 files changed, 66 insertions(+) create mode 100644 tests/soroban_testcases/block_number.rs diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 0ae1fa2d5..65e1121ef 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -136,6 +136,7 @@ pub enum HostFunctions { StringNewFromLinearMemory, StrKeyToAddr, GetLedgerTimestamp, + GetLedgerSequence, GetCurrentContractAddress, BytesNewFromLinearMemory, BytesLen, @@ -191,6 +192,7 @@ impl HostFunctions { HostFunctions::VecPushBack => "v.6", HostFunctions::StringNewFromLinearMemory => "b.i", HostFunctions::StrKeyToAddr => "a.1", + HostFunctions::GetLedgerSequence => "x.3", HostFunctions::GetLedgerTimestamp => "x.4", HostFunctions::GetCurrentContractAddress => "x.7", HostFunctions::BytesNewFromLinearMemory => "b.3", diff --git a/src/codegen/targets/soroban/mod.rs b/src/codegen/targets/soroban/mod.rs index 390dd564c..54d9a1c07 100644 --- a/src/codegen/targets/soroban/mod.rs +++ b/src/codegen/targets/soroban/mod.rs @@ -326,6 +326,29 @@ impl TargetCodegen for SorobanTarget { ); Some(address_var) } + ast::Builtin::BlockNumber => { + let block_var_no = vartab.temp_anonymous(&Type::Uint(64)); + let block_var = Expression::Variable { + loc: *loc, + ty: Type::Uint(64), + var_no: block_var_no, + }; + cfg.add( + vartab, + Instr::Call { + res: vec![block_var_no], + return_tys: vec![Type::Uint(64)], + call: InternalCallTy::HostFunction { + name: HostFunctions::GetLedgerSequence.name().to_string(), + }, + args: vec![], + }, + ); + //decoding to uint64 since get_ledger_sequence returns + let decoded_block_number = + soroban_decode_arg(block_var, cfg, vartab, ns, Some(Type::Uint(64))); + Some(decoded_block_number) + } ast::Builtin::RequireAuth => { let var_temp = vartab.temp( &pt::Identifier { diff --git a/src/emit/soroban/mod.rs b/src/emit/soroban/mod.rs index 83e43ed6c..7cf57f6ea 100644 --- a/src/emit/soroban/mod.rs +++ b/src/emit/soroban/mod.rs @@ -119,6 +119,7 @@ impl HostFunctions { .fn_type(&[ty.into(), ty.into()], false), HostFunctions::StrKeyToAddr => bin.context.i64_type().fn_type(&[ty.into()], false), HostFunctions::GetLedgerTimestamp => bin.context.i64_type().fn_type(&[], false), + HostFunctions::GetLedgerSequence => bin.context.i64_type().fn_type(&[], false), HostFunctions::GetCurrentContractAddress => bin.context.i64_type().fn_type(&[], false), HostFunctions::ObjToI128Lo64 => bin.context.i64_type().fn_type(&[ty.into()], false), HostFunctions::ObjToI128Hi64 => bin.context.i64_type().fn_type(&[ty.into()], false), @@ -495,6 +496,7 @@ impl SorobanTarget { HostFunctions::StringNewFromLinearMemory, HostFunctions::StrKeyToAddr, HostFunctions::GetLedgerTimestamp, + HostFunctions::GetLedgerSequence, HostFunctions::GetCurrentContractAddress, HostFunctions::BytesNewFromLinearMemory, HostFunctions::BytesCopyToLinearMemory, diff --git a/tests/soroban_testcases/block_number.rs b/tests/soroban_testcases/block_number.rs new file mode 100644 index 000000000..b31736572 --- /dev/null +++ b/tests/soroban_testcases/block_number.rs @@ -0,0 +1,38 @@ +use crate::build_solidity; +use soroban_sdk::testutils::Ledger; +use soroban_sdk::{FromVal, Val}; + +#[test] +fn get_ledger_sequence() { + let runtime = build_solidity( + r#" + contract LedgerSequence { + function get_ledger_sequence() public view returns (uint64) { + return block.number; + } + } + "#, + |_| {}, + ); + let addr = runtime.contracts.last().unwrap(); + let samples: Vec = vec![ + 1, + 99, + 2, + 33, + 13, + 9, + 15, + 0, + 10001, + 1_000_000_000, + 2 << 16, + 2 << 24, + ]; + for number in samples { + runtime.env.ledger().set_sequence_number(number as u32); + let block_number_val: Val = runtime.invoke_contract(addr, "get_ledger_sequence", vec![]); + let block_number_u64: u64 = FromVal::from_val(&runtime.env, &block_number_val); + assert_eq!(number, block_number_u64); + } +} diff --git a/tests/soroban_testcases/mod.rs b/tests/soroban_testcases/mod.rs index 1f8fae3c7..27d89e991 100644 --- a/tests/soroban_testcases/mod.rs +++ b/tests/soroban_testcases/mod.rs @@ -3,6 +3,7 @@ mod alloc; mod array_args; mod atomic_swap; mod auth; +mod block_number; mod bytes_fail; mod bytes_pass; mod constructor; From 113b8487501b214b9988fcdc1624b927fa4be0db Mon Sep 17 00:00:00 2001 From: slash-aech Date: Fri, 17 Jul 2026 18:09:17 +0530 Subject: [PATCH 2/3] Changed according to reviews removed comments, changed variable type and removed redudant variable returning Signed-off-by: slash-aech --- src/codegen/targets/soroban/mod.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/codegen/targets/soroban/mod.rs b/src/codegen/targets/soroban/mod.rs index 54d9a1c07..95083dc82 100644 --- a/src/codegen/targets/soroban/mod.rs +++ b/src/codegen/targets/soroban/mod.rs @@ -327,7 +327,7 @@ impl TargetCodegen for SorobanTarget { Some(address_var) } ast::Builtin::BlockNumber => { - let block_var_no = vartab.temp_anonymous(&Type::Uint(64)); + let block_var_no = vartab.temp_name("block_number", &Type::Uint(64)); let block_var = Expression::Variable { loc: *loc, ty: Type::Uint(64), @@ -344,10 +344,7 @@ impl TargetCodegen for SorobanTarget { args: vec![], }, ); - //decoding to uint64 since get_ledger_sequence returns - let decoded_block_number = - soroban_decode_arg(block_var, cfg, vartab, ns, Some(Type::Uint(64))); - Some(decoded_block_number) + Some(soroban_decode_arg(block_var, cfg, vartab, ns, Some(Type::Uint(64)))) } ast::Builtin::RequireAuth => { let var_temp = vartab.temp( From b6522daf10dc5452c09bd24fa96f2db9708d4cb0 Mon Sep 17 00:00:00 2001 From: slash-aech Date: Fri, 17 Jul 2026 19:31:43 +0530 Subject: [PATCH 3/3] fixed cargo fmt Signed-off-by: slash-aech --- src/codegen/targets/soroban/mod.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/codegen/targets/soroban/mod.rs b/src/codegen/targets/soroban/mod.rs index 95083dc82..aa33f52d1 100644 --- a/src/codegen/targets/soroban/mod.rs +++ b/src/codegen/targets/soroban/mod.rs @@ -344,7 +344,13 @@ impl TargetCodegen for SorobanTarget { args: vec![], }, ); - Some(soroban_decode_arg(block_var, cfg, vartab, ns, Some(Type::Uint(64)))) + Some(soroban_decode_arg( + block_var, + cfg, + vartab, + ns, + Some(Type::Uint(64)), + )) } ast::Builtin::RequireAuth => { let var_temp = vartab.temp(