Skip to content

Commit bf35ad6

Browse files
authored
Merge pull request #822 from Saboleee/feature/contract-soroban-sdk-bump
chore(contract): bump workspace to 0.1.1 and soroban-sdk 21.7.7
2 parents fd8620f + e8e4202 commit bf35ad6

24 files changed

Lines changed: 237 additions & 283 deletions

File tree

contract/CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Changelog
2+
3+
All notable changes to this Soroban workspace are documented here.
4+
5+
## 0.1.1
6+
7+
### Changed
8+
9+
- Workspace crate versions aligned to **0.1.1**.
10+
- **`soroban-sdk`** workspace dependency updated to **21.7.7** (from 21.7.0), with `Cargo.lock` kept in sync.
11+
12+
### Fixed
13+
14+
- **myfans-token**: Temporary allowance TTL is extended so entries remain readable through `expiration_ledger + 1`, allowing `transfer_from` to return `AllowanceExpired` instead of `NoAllowance` after Soroban 21.7 TTL behavior; TTL is refreshed after partial `transfer_from` and `clear_allowance`.
15+
- **Tests**: Adjusted for SDK/host semantics (contract-scoped event emission, ledger jumps vs instance TTL, `WithdrawEvent` decoding, empty auths via `mock_auths(&[])` / `set_auths`, and related integration cases).
16+
17+
### Tooling
18+
19+
- `scripts/release-check.sh` asserts the workspace `soroban-sdk` pin in `Cargo.toml` (update the script when bumping the SDK).

contract/Cargo.lock

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contract/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ members = [
1616
]
1717

1818
[workspace.package]
19-
version = "0.1.0"
19+
version = "0.1.1"
2020
edition = "2021"
2121
# Minimum Supported Rust Version (MSRV).
2222
# soroban-sdk 21.x requires at least 1.74 (curve25519-dalek 4.x lower bound).
@@ -29,7 +29,7 @@ description = "MyFans Soroban smart contracts."
2929
publish = false
3030

3131
[workspace.dependencies]
32-
soroban-sdk = "21.7.0"
32+
soroban-sdk = "21.7.7"
3333

3434
[profile.release]
3535
opt-level = "z"

contract/contracts/content-access/src/content_query_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#[cfg(test)]
44
mod content_query_tests {
55
use crate::{ContentAccess, ContentAccessClient};
6-
use soroban_sdk::{testutils::Address as _, Address, Env};
6+
use soroban_sdk::{testutils::Address as _, testutils::Ledger, Address, Env};
77

88
fn setup() -> (Env, Address) {
99
let env = Env::default();

contract/contracts/content-access/src/lib.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,13 @@ mod test {
250250
use super::*;
251251
use soroban_sdk::{
252252
testutils::{Address as _, Events, Ledger},
253-
vec, Address, Env, Error as SorobanError, IntoVal, Symbol, TryIntoVal,
253+
vec,
254+
xdr::SorobanAuthorizationEntry,
255+
Address, Env, Error as SorobanError, IntoVal, Symbol, TryIntoVal,
254256
};
255257

258+
const EMPTY_AUTHS: &[SorobanAuthorizationEntry] = &[];
259+
256260
// Mock token contract for testing
257261
#[contract]
258262
pub struct MockToken;
@@ -727,11 +731,9 @@ mod test {
727731
env.mock_all_auths();
728732
client.initialize(&admin, &token_id);
729733

730-
let env2 = Env::default();
731-
let client2 = ContentAccessClient::new(&env2, &contract_id);
732-
733-
let creator = Address::generate(&env2);
734-
client2.set_content_price(&creator, &1, &100);
734+
let creator = Address::generate(&env);
735+
env.set_auths(EMPTY_AUTHS);
736+
client.set_content_price(&creator, &1, &100);
735737
}
736738

737739
#[test]
@@ -743,7 +745,7 @@ mod test {
743745

744746
let admin = Address::generate(&env);
745747
let invalid_token_contract = env.register_contract(None, ContentAccess);
746-
let invalid_token_address: Address = invalid_token_contract.into();
748+
let invalid_token_address = invalid_token_contract;
747749

748750
let contract_id = env.register_contract(None, ContentAccess);
749751
let client = ContentAccessClient::new(&env, &contract_id);

contract/contracts/creator-deposits/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ mod test {
195195
client.deposit(&creator, &token, &1000);
196196

197197
// Verify transfer was called with correct fee (50)
198-
assert!(env.auths().len() > 0);
198+
assert!(!env.auths().is_empty());
199199
}
200200

201201
#[test]

contract/contracts/creator-earnings/src/test.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![cfg(test)]
2-
31
use super::*;
42
use soroban_sdk::token::{Client as TokenClient, StellarAssetClient};
53
use soroban_sdk::{
@@ -182,28 +180,33 @@ fn withdraw_emits_event() {
182180
client.deposit(&depositor, &creator, &500);
183181
client.withdraw(&creator, &200);
184182

185-
// events().all() returns Vec<(contract_addr, topics: Vec<Val>, data: Val)>
186-
let events = env.events().all();
187-
let withdraw_event = events.iter().find(|e| {
188-
// e.1 = topics, e.2 = data
189-
e.1.first().map_or(false, |t| {
190-
t.try_into_val(&env).ok() == Some(Symbol::new(&env, "withdraw"))
191-
})
192-
});
193-
194-
assert!(withdraw_event.is_some(), "withdraw event not emitted");
195-
196-
let event = withdraw_event.unwrap();
183+
let all_events = env.events().all();
184+
let mut withdraw_event: Option<(
185+
Address,
186+
soroban_sdk::Vec<soroban_sdk::Val>,
187+
soroban_sdk::Val,
188+
)> = None;
189+
for i in 0..all_events.len() {
190+
let evt = all_events.get(i).unwrap();
191+
let (id, topics, _data) = &evt;
192+
if *id != client.address {
193+
continue;
194+
}
195+
let t0: Option<Symbol> = topics.get(0).and_then(|v| v.try_into_val(&env).ok());
196+
if t0 == Some(Symbol::new(&env, "withdraw")) {
197+
withdraw_event = Some(evt);
198+
break;
199+
}
200+
}
201+
202+
let event = withdraw_event.expect("withdraw event not emitted");
197203

198-
// Assert topics: single symbol "withdraw"
199204
assert_eq!(event.1.len(), 1);
200-
let topic_symbol: Symbol = event.1.first().unwrap().try_into_val(&env).unwrap();
205+
let topic_symbol: Symbol = event.1.get(0).unwrap().try_into_val(&env).unwrap();
201206
assert_eq!(topic_symbol, Symbol::new(&env, "withdraw"));
202207

203-
// Assert data: (creator, amount, token)
204-
let (event_creator, event_amount, event_token): (Address, i128, Address) =
205-
event.2.try_into_val(&env).unwrap();
206-
assert_eq!(event_creator, creator);
207-
assert_eq!(event_amount, 200);
208-
assert_eq!(event_token, token_address);
208+
let withdraw_data: WithdrawEvent = event.2.try_into_val(&env).unwrap();
209+
assert_eq!(withdraw_data.creator, creator);
210+
assert_eq!(withdraw_data.amount, 200);
211+
assert_eq!(withdraw_data.token, token_address);
209212
}

contract/contracts/creator-registry/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#![no_std]
22

33
use soroban_sdk::{
4-
contract, contracterror, contractimpl, contracttype, panic_with_error, Address, Env, Symbol,
4+
contract, contracterror, contractimpl, contracttype, panic_with_error, Address, Env,
55
};
66

77
use soroban_sdk::token::Client;
@@ -173,4 +173,5 @@ impl CreatorRegistryContract {
173173
}
174174
}
175175

176+
#[cfg(test)]
176177
mod test;

contract/contracts/creator-registry/src/test.rs

Lines changed: 6 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![cfg(test)]
2-
31
use super::Error as ContractError;
42
use super::*;
53
use soroban_sdk::{
@@ -178,75 +176,6 @@ fn test_registration_ledger_key_helper_keeps_legacy_variant() {
178176
);
179177
}
180178

181-
#[test]
182-
fn test_update_creator_id_authorized() {
183-
let env = Env::default();
184-
env.mock_all_auths();
185-
186-
let contract_id = env.register_contract(None, CreatorRegistryContract);
187-
let client = CreatorRegistryContractClient::new(&env, &contract_id);
188-
let admin = Address::generate(&env);
189-
let creator = Address::generate(&env);
190-
191-
client.initialize(&admin);
192-
client.register_creator(&creator, &creator, &111);
193-
194-
client.update_creator_id(&creator, &creator, &222);
195-
196-
assert_eq!(client.get_creator_id(&creator), Some(222));
197-
198-
let events = env.events().all();
199-
let found = events.iter().any(|event| {
200-
let topic: soroban_sdk::Symbol = event.1.get(0).unwrap().try_into_val(&env).unwrap();
201-
topic == soroban_sdk::Symbol::new(&env, "creator_updated")
202-
});
203-
assert!(found, "creator_updated event not emitted");
204-
}
205-
206-
#[test]
207-
fn test_update_creator_id_unauthorized_fails() {
208-
let env = Env::default();
209-
env.mock_all_auths();
210-
211-
let contract_id = env.register_contract(None, CreatorRegistryContract);
212-
let client = CreatorRegistryContractClient::new(&env, &contract_id);
213-
let admin = Address::generate(&env);
214-
let creator = Address::generate(&env);
215-
let rando = Address::generate(&env);
216-
217-
client.initialize(&admin);
218-
client.register_creator(&creator, &creator, &111);
219-
220-
let result = client.try_update_creator_id(&rando, &creator, &222);
221-
assert_eq!(
222-
result,
223-
Err(Ok(SorobanError::from_contract_error(
224-
Error::Unauthorized as u32,
225-
)))
226-
);
227-
}
228-
229-
#[test]
230-
fn test_update_creator_id_not_registered_fails() {
231-
let env = Env::default();
232-
env.mock_all_auths();
233-
234-
let contract_id = env.register_contract(None, CreatorRegistryContract);
235-
let client = CreatorRegistryContractClient::new(&env, &contract_id);
236-
let admin = Address::generate(&env);
237-
let creator = Address::generate(&env);
238-
239-
client.initialize(&admin);
240-
241-
let result = client.try_update_creator_id(&admin, &creator, &222);
242-
assert_eq!(
243-
result,
244-
Err(Ok(SorobanError::from_contract_error(
245-
Error::NotRegistered as u32,
246-
)))
247-
);
248-
}
249-
250179
// ─── Rate limit boundary tests (issue #320) ───────────────────────────────────
251180

252181
/// Advance the ledger sequence by `n` ledgers.
@@ -399,16 +328,19 @@ fn rate_limit_is_per_caller_not_global() {
399328
fn first_registration_is_never_rate_limited() {
400329
let env = Env::default();
401330
env.mock_all_auths();
331+
332+
// High ledger must be set before instance storage is written: jumping here
333+
// after initialize would exceed the entry TTL and archive keys (SDK 21.7+).
334+
env.ledger().with_mut(|li| li.sequence_number = 99_999);
335+
402336
let contract_id = env.register_contract(None, CreatorRegistryContract);
403337
let client = CreatorRegistryContractClient::new(&env, &contract_id);
404338
let admin = Address::generate(&env);
405339
let creator = Address::generate(&env);
406340

407341
client.initialize(&admin);
408342

409-
// Jump to a high ledger — no prior registration so limit cannot apply
410-
env.ledger().with_mut(|li| li.sequence_number = 99_999);
411-
343+
// No prior registration for admin — rate limit cannot apply
412344
client.register_creator(&admin, &creator, &99u64);
413345

414346
assert_eq!(

contract/contracts/earnings/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ description.workspace = true
99
publish.workspace = true
1010

1111
[lib]
12-
crate-type = ["cdylib"]
12+
crate-type = ["cdylib", "rlib"]
1313

1414
[dependencies]
1515
soroban-sdk = { workspace = true }

0 commit comments

Comments
 (0)