Skip to content

Commit d22152d

Browse files
authored
Merge pull request #48 from iotaledger/chore/make-lock-optional
chore: make `delete_lock` for locked notarization optional
2 parents 76bdb92 + 12401d4 commit d22152d

File tree

9 files changed

+39
-77
lines changed

9 files changed

+39
-77
lines changed

notarization-move/Move.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ flavor = "iota"
2929
[env]
3030

3131
[env.localnet]
32-
chain-id = "c7a0abbd"
33-
original-published-id = "0x7fab7adeb06a0087b65cd6712e270d338d39f002f8abfb3d252f88c843b61070"
34-
latest-published-id = "0x7fab7adeb06a0087b65cd6712e270d338d39f002f8abfb3d252f88c843b61070"
32+
chain-id = "002d6fb7"
33+
original-published-id = "0x760def1fd86d216536bb3f8809baed9e075a73c428aeb776e4d47ad88e9fc6b4"
34+
latest-published-id = "0x760def1fd86d216536bb3f8809baed9e075a73c428aeb776e4d47ad88e9fc6b4"
3535
published-version = "1"
3636

3737
[env.devnet]

notarization-move/sources/dynamic_notarization.move

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public fun new<D: store + drop + copy>(
3131
state: notarization::State<D>,
3232
immutable_description: Option<String>,
3333
updatable_metadata: Option<String>,
34-
transfer_lock: Option<TimeLock>,
34+
transfer_lock: TimeLock,
3535
clock: &Clock,
3636
ctx: &mut TxContext,
3737
): notarization::Notarization<D> {
@@ -50,7 +50,7 @@ public fun create<D: store + drop + copy>(
5050
state: notarization::State<D>,
5151
immutable_description: Option<String>,
5252
updatable_metadata: Option<String>,
53-
transfer_lock: Option<TimeLock>,
53+
transfer_lock: TimeLock,
5454
clock: &Clock,
5555
ctx: &mut TxContext,
5656
) {

notarization-move/sources/notarization.move

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,14 +186,16 @@ public(package) fun new_dynamic_notarization<D: store + drop + copy>(
186186
state: State<D>,
187187
immutable_description: Option<String>,
188188
updatable_metadata: Option<String>,
189-
transfer_lock: Option<TimeLock>,
189+
transfer_lock: TimeLock,
190190
clock: &Clock,
191191
ctx: &mut TxContext,
192192
): Notarization<D> {
193-
let locking = option::map!(
194-
transfer_lock,
195-
|transfer_lock| new_lock_metadata(timelock::none(), timelock::none(), transfer_lock),
196-
);
193+
let locking = if (timelock::is_none(&transfer_lock)) {
194+
timelock::destroy(transfer_lock, clock);
195+
option::none()
196+
} else {
197+
option::some(new_lock_metadata(timelock::none(), timelock::none(), transfer_lock))
198+
};
197199

198200
let immutable_metadata = ImmutableMetadata {
199201
created_at: clock::timestamp_ms(clock),

notarization-move/tests/dynamic_notarization_tests.move

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public fun test_create_dynamic_notarization_with_string_data() {
3030
state,
3131
std::option::some(string::utf8(b"Test Description")),
3232
std::option::some(string::utf8(b"Test Updatable Metadata")),
33-
std::option::none(),
33+
timelock::none(),
3434
&clock,
3535
ctx,
3636
);
@@ -84,7 +84,7 @@ public fun test_create_dynamic_notarization_with_vector_data() {
8484
state,
8585
std::option::some(string::utf8(b"Test Description")),
8686
std::option::some(string::utf8(b"Test Updatable Metadata")),
87-
std::option::none(),
87+
timelock::none(),
8888
&clock,
8989
ctx,
9090
);
@@ -139,7 +139,7 @@ public fun test_create_dynamic_notarization_with_transfer_lock() {
139139
state,
140140
std::option::some(string::utf8(b"Test Description")),
141141
std::option::some(string::utf8(b"Test Updatable Metadata")),
142-
std::option::some(transfer_lock),
142+
transfer_lock,
143143
&clock,
144144
ctx,
145145
);
@@ -183,7 +183,7 @@ public fun test_transfer_dynamic_notarization() {
183183
state,
184184
std::option::none(),
185185
std::option::none(),
186-
std::option::none(),
186+
timelock::none(),
187187
&clock,
188188
scenario.ctx(),
189189
);
@@ -242,7 +242,7 @@ public fun test_transfer_locked_dynamic_notarization() {
242242
state,
243243
std::option::none(),
244244
std::option::none(),
245-
std::option::some(transfer_lock),
245+
transfer_lock,
246246
&clock,
247247
scenario.ctx(),
248248
);
@@ -285,7 +285,7 @@ public fun test_update_dynamic_notarization() {
285285
state,
286286
std::option::none(),
287287
std::option::none(),
288-
std::option::none(),
288+
timelock::none(),
289289
&clock,
290290
ctx,
291291
);
@@ -344,7 +344,7 @@ public fun test_dynamic_notarization_with_until_destroyed_lock() {
344344
state,
345345
std::option::none(),
346346
std::option::none(),
347-
std::option::some(transfer_lock),
347+
transfer_lock,
348348
&clock,
349349
ctx,
350350
);
@@ -368,7 +368,7 @@ public fun test_dynamic_notarization_with_until_destroyed_lock() {
368368
scenario.end();
369369
}
370370

371-
#[test, expected_failure(abort_code = notarization::EDynamicNotarizationInvariants)]
371+
#[test]
372372
public fun test_dynamic_notarization_with_none_lock() {
373373
let mut scenario = ts::begin(ADMIN_ADDRESS);
374374
let ctx = scenario.ctx();
@@ -388,7 +388,7 @@ public fun test_dynamic_notarization_with_none_lock() {
388388
state,
389389
std::option::none(),
390390
std::option::none(),
391-
std::option::some(transfer_lock),
391+
transfer_lock,
392392
&clock,
393393
ctx,
394394
);
@@ -400,6 +400,7 @@ public fun test_dynamic_notarization_with_none_lock() {
400400

401401
// Verify it's transferable (has none transfer lock)
402402
assert!(dynamic_notarization::is_transferable(&notarization, &clock), 0);
403+
assert!(notarization.lock_metadata().is_none(), 0);
403404

404405
// Clean up
405406
notarization::destroy(notarization, &clock);

notarization-move/tests/notarization_tests.move

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public fun test_create_notarization_with_complex_object() {
4848
state,
4949
std::option::some(string::utf8(b"Test Description")),
5050
std::option::some(string::utf8(b"Test Updateable Metadata")),
51-
std::option::none(),
51+
timelock::none(),
5252
&clock,
5353
ctx,
5454
);
@@ -153,7 +153,7 @@ public fun test_state_updates_and_versioning() {
153153
state,
154154
std::option::some(string::utf8(b"Test Description")),
155155
std::option::some(string::utf8(b"Test Updateable Metadata")),
156-
std::option::none(),
156+
timelock::none(),
157157
&clock,
158158
ctx,
159159
);
@@ -316,7 +316,7 @@ public fun test_method_type_checks() {
316316
state,
317317
std::option::none(),
318318
std::option::none(),
319-
std::option::none(),
319+
timelock::none(),
320320
&clock,
321321
ctx,
322322
);
@@ -363,7 +363,7 @@ public fun test_is_destroy_allowed() {
363363
state,
364364
std::option::none(),
365365
std::option::none(),
366-
std::option::none(),
366+
timelock::none(),
367367
&clock,
368368
ctx,
369369
);
@@ -408,7 +408,7 @@ public fun test_method_specific_invariants() {
408408
state,
409409
std::option::none(),
410410
std::option::none(),
411-
std::option::none(),
411+
timelock::none(),
412412
&clock,
413413
ctx,
414414
);

notarization-rs/src/core/builder.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ impl NotarizationBuilder<Locked> {
4949
}
5050

5151
pub fn finish(self) -> Result<TransactionBuilder<CreateNotarization<Locked>>, Error> {
52-
if self.delete_lock.is_none() {
53-
return Err(Error::InvalidArgument("Locked needs delete_at()".to_string()));
54-
}
5552
Ok(TransactionBuilder::new(CreateNotarization::new(self)))
5653
}
5754
}

notarization-rs/src/core/move_utils.rs

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
use std::str::FromStr;
55

66
use iota_interaction::rpc_types::IotaObjectDataOptions;
7-
use iota_interaction::types::base_types::{ObjectID, ObjectRef, STD_OPTION_MODULE_NAME};
7+
use iota_interaction::types::base_types::{ObjectID, ObjectRef};
88
use iota_interaction::types::programmable_transaction_builder::ProgrammableTransactionBuilder as Ptb;
99
use iota_interaction::types::transaction::{Argument, ObjectArg};
10-
use iota_interaction::types::{
11-
IOTA_CLOCK_OBJECT_ID, IOTA_CLOCK_OBJECT_SHARED_VERSION, MOVE_STDLIB_PACKAGE_ID, TypeTag,
12-
};
13-
use iota_interaction::{IotaClientTrait, OptionalSync, ident_str};
10+
use iota_interaction::types::{IOTA_CLOCK_OBJECT_ID, IOTA_CLOCK_OBJECT_SHARED_VERSION, TypeTag};
11+
use iota_interaction::{IotaClientTrait, OptionalSync};
1412
use product_common::core_client::CoreClientReadOnly;
1513
use serde::Serialize;
1614

@@ -26,32 +24,6 @@ pub(crate) fn get_clock_ref(ptb: &mut Ptb) -> Argument {
2624
.expect("network has a singleton clock instantiated")
2725
}
2826

29-
pub(crate) fn option_to_move_with_tag(
30-
option: Option<Argument>,
31-
tag: TypeTag,
32-
ptb: &mut Ptb,
33-
) -> Result<Argument, Error> {
34-
let arg = if let Some(t) = option {
35-
ptb.programmable_move_call(
36-
MOVE_STDLIB_PACKAGE_ID,
37-
STD_OPTION_MODULE_NAME.into(),
38-
ident_str!("some").into(),
39-
vec![tag],
40-
vec![t],
41-
)
42-
} else {
43-
ptb.programmable_move_call(
44-
MOVE_STDLIB_PACKAGE_ID,
45-
STD_OPTION_MODULE_NAME.into(),
46-
ident_str!("none").into(),
47-
vec![tag],
48-
vec![],
49-
)
50-
};
51-
52-
Ok(arg)
53-
}
54-
5527
pub(crate) fn ptb_pure<T>(ptb: &mut Ptb, name: &str, value: T) -> Result<Argument, Error>
5628
where
5729
T: Serialize + core::fmt::Debug,

notarization-rs/src/core/notarization.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,9 @@ impl<M: Clone> CreateNotarization<M> {
5353

5454
/// Indicates if the invariants for `NotarizationMethod::Dynamic` are satisfied:
5555
///
56-
/// - Dynamic notarization can only have transfer locking or no
57-
/// `immutable_metadata.locking`.
58-
/// If `immutable_metadata.locking` exists, all locks except `transfer_lock`
59-
/// must be `TimeLock::None`
60-
/// and the `transfer_lock` must not be `TimeLock::None`.
56+
/// - Dynamic notarization can only have transfer locking or no `immutable_metadata.locking`. If
57+
/// `immutable_metadata.locking` exists, all locks except `transfer_lock` must be `TimeLock::None` and the
58+
/// `transfer_lock` must not be `TimeLock::None`.
6159
fn are_dynamic_notarization_invariants_ok(locking: &Option<LockMetadata>) -> bool {
6260
match locking {
6361
Some(lock_metadata) => {
@@ -126,7 +124,7 @@ impl<M: Clone> CreateNotarization<M> {
126124
state,
127125
immutable_description,
128126
updatable_metadata,
129-
transfer_lock,
127+
transfer_lock.unwrap_or(TimeLock::None),
130128
)
131129
}
132130
NotarizationMethod::Locked => {
@@ -136,14 +134,10 @@ impl<M: Clone> CreateNotarization<M> {
136134
));
137135
}
138136

139-
let delete_lock = delete_lock.ok_or_else(|| {
140-
Error::InvalidArgument("Delete lock is required for locked notarizations".to_string())
141-
})?;
142-
143137
// Construct the locking metadata for locked notarization
144138
let locking = Some(LockMetadata {
145139
update_lock: TimeLock::UntilDestroyed,
146-
delete_lock: delete_lock.clone(),
140+
delete_lock: delete_lock.clone().unwrap_or(TimeLock::None),
147141
transfer_lock: TimeLock::UntilDestroyed,
148142
});
149143

@@ -159,7 +153,7 @@ impl<M: Clone> CreateNotarization<M> {
159153
state,
160154
immutable_description,
161155
updatable_metadata,
162-
delete_lock,
156+
delete_lock.unwrap_or(TimeLock::None),
163157
)
164158
}
165159
}

notarization-rs/src/core/operations.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use iota_interaction::types::Identifier;
88
use iota_interaction::types::base_types::{IotaAddress, ObjectID};
99
use iota_interaction::types::programmable_transaction_builder::ProgrammableTransactionBuilder;
1010
use iota_interaction::types::transaction::{Argument, ObjectArg, ProgrammableTransaction};
11-
use iota_interaction::{MoveType, OptionalSync, ident_str};
11+
use iota_interaction::{OptionalSync, ident_str};
1212
use product_common::core_client::CoreClientReadOnly;
1313

1414
use super::move_utils;
@@ -121,7 +121,7 @@ pub trait NotarizationOperations {
121121
state: State,
122122
immutable_description: Option<String>,
123123
updatable_metadata: Option<String>,
124-
transfer_lock: Option<TimeLock>,
124+
transfer_lock: TimeLock,
125125
) -> Result<ProgrammableTransaction, Error> {
126126
let mut ptb = ProgrammableTransactionBuilder::new();
127127

@@ -130,11 +130,7 @@ pub trait NotarizationOperations {
130130
let state_arg = state.into_ptb(&mut ptb, package_id)?;
131131
let immutable_description = move_utils::ptb_pure(&mut ptb, "immutable_description", immutable_description)?;
132132
let updatable_metadata = move_utils::ptb_pure(&mut ptb, "updatable_metadata", updatable_metadata)?;
133-
let transfer_lock = transfer_lock
134-
.map(|lock| lock.to_ptb(&mut ptb, package_id))
135-
.transpose()?;
136-
let transfer_lock =
137-
move_utils::option_to_move_with_tag(transfer_lock, TimeLock::move_type(package_id), &mut ptb)?;
133+
let transfer_lock = transfer_lock.to_ptb(&mut ptb, package_id)?;
138134

139135
ptb.programmable_move_call(
140136
package_id,

0 commit comments

Comments
 (0)