From eef3ece2b8d17d18b1c3259385a5f447e85f24d9 Mon Sep 17 00:00:00 2001 From: Seth Schoen Date: Mon, 24 Aug 2026 13:39:02 -0700 Subject: [PATCH 1/3] Replace the deprecated relative distance timelock Switch the deprecated relative distance timelock call in the example contract examples/last_will.simf out, replacing it with a (proposed) stdlib function that enforces the same timelock policy correctly. --- examples/last_will.simf | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/examples/last_will.simf b/examples/last_will.simf index d791e155..13c5a42b 100644 --- a/examples/last_will.simf +++ b/examples/last_will.simf @@ -24,9 +24,27 @@ fn recursive_covenant() { assert!(unwrap(jet::output_is_fee(1))); } +pub fn enforce_relative_distance(min_distance: Distance) { + // Assert that the current input is spent in a transaction that can + // only appear a distance of at least min_distance blocks after the + // block containing the input UTXO. + // Panic otherwise. + + // This is a replacement for the deprecated jet::check_lock_distance. + + // Transaction version must be at least 2. + assert!(jet::le_32(2, jet::version())); + + // Fetch and parse sequence + let actual_data: Either = unwrap(jet::parse_sequence(jet::current_sequence())); + let actual_distance: Distance = unwrap_left::(actual_data); + + assert!(jet::le_16(min_distance, actual_distance)); +} + fn inherit_spend(inheritor_sig: Signature) { let days_180: Distance = 25920; - jet::broken_do_not_use_check_lock_distance(days_180); + enforce_relative_distance(days_180); let inheritor_pk: Pubkey = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798; // 1 * G checksig(inheritor_pk, inheritor_sig); } From 0066e9357433605e72965b018f1974ef29a6996a Mon Sep 17 00:00:00 2001 From: Seth Schoen Date: Tue, 25 Aug 2026 16:41:02 -0700 Subject: [PATCH 2/3] Update test data for last_will program --- test-data/last_will.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-data/last_will.json b/test-data/last_will.json index 3764d1b4..258f706a 100644 --- a/test-data/last_will.json +++ b/test-data/last_will.json @@ -1,4 +1,4 @@ { - "program": "5vHQKEGJsWVABAmKSEGCrynMGLpUF69BbvwQFoAuY+y1ngQJfqSPabfWRZ9K3F2jdRYYBitLzfMz987l3WKtAxSudDhYOBTf5tlucUbKz5QK2LfAvMA1kChBh+DHCpJAk4cziqISK6EzABFXCwYvClhPYGFQusJfripGQssOAVt34AhgGJAoSQbgJxuBig/FJwqFobGHNddy8HoTqejIHGcv8bcleUZT57KmW1Vp7LXaMUR4qMQ4YBiE3n41BAOBgcOJFAGQOJwuLAGkHHAHHq04wI/yiD2vraYIqA3SuA+bC47xyXGd55T1dYE3K44T3KDj4JyBFw3hIG4TisDgQMQOQy0/JhFAMksYYgkmifC/E6pFNqY5CLBt8zYQwD4id5wG3yDkOE5FJIEnwxOZ+Cq1myCZY7Ax/Klosw4w/YaiSrNDaOhM/+erWaIc9xgwDFZAAAAAQNIVC1M24nMERf6gONImmAwub35L6eiVhI0f2X8hANtDAEy06t3vxQYBiFwBg5gXe+1Cj7rQ+ji6QJDRW0vEmFLGZXcRhKAN6Nt0/l2ADDAMXw4Ic3idDCRwDPfEbxc9Hgqw6MFFnfB5SG98/3X6ptShJKOWBgHCQnKlJFkAAAAAAoVfDUc2gh0FinqrkqEEWyo/WTDVDT/U2bJS9gAmPKXAmHgCyTBgGIWkhIoZ0QznIWef/b40z+a+nNzThyQhoT+7cjE0KYRLTvzYTFzcowwDAc3eSs4FpHnyXmUvPp+bP+chOe9mSnFV9hx0R9iADzY6JhgGsgUJIPrNyvFAsGbdBzbSrO1OkcGEXy6AONowywuX3+NCWUQGHsywjitxQ2nK+GAYhajfQgn7m8T+SlBrmrOch86kHUDO438Z7mfcnzyKpQtkIOHi8CrIAAAABBwALgD4bDmlQbnQY5qA9/2zzyEMPHpAcN+yqDG3zI2HUxtIATDp2sMAxC4MQkUIMDxOBgOYGXVkQBL/b5MeFxWiMI+ZrKqP2EBia/TaUHWcUSNgAOAwDWFxEaX1K4z6OmpuEjKjkFQMqzncIxclF/HT1pwsizWH6XvSw8hwKE4nA5ai4WA5bg4sA5ChcjAHLsHMsE5lwOXwuV4DmAByqA5tAeV4PLkDm5A=", + "program": "6Ad0ChBibFlQAQJigxJFkAAAABAoVw+HGBzZH6trs+PtsPueC9Nnym4TM1piAZl54eFsnCxmnF7pS6GAYhZhamnAMTmMFtnPC/xiI5Vb9WwZIGczi6x80m4GQqYsGLmPKAWqxQMAxC4AwcwYulQXr0Fu/BAWgC5j7LWeBAl+pI9pt9ZFn0rcXaN1FhgGL4cFObcfgvfnf7Zau3ugLBURp8JIm9U2mH5DhfrY86e/4erQgwDg4XC2zhzFpWDlztsK/m/gR96TLql2o3z5rZRs2b7zY/xcmR+BSQGAYhcQkJFDOiGc5Czz/7fGmfzX05uacOSENCf3bkYmhTCJad+bCYugwNAxHMbF1+kP4Eem3zb/kCJKtk0jc2kvvObaA36q97mNfCmOQYBsCcYpINrFCRbhuOAuAgo5n+5nw8Ow8SUaLVk5EoJylbJLr0eorb3VMvKJpVtDy6gDANJAoSQfkGcbkKKBYtOAYHNFZRJaXTw8Jpe2xmpeKV76/KwtJclIr9i/JoPOZEHH1IYBiFrM32D6TScdfHnfIVTCl4baXfhg2oqbO7evK+KadNVmcNYeOgKE4Afk0CAcEA4kC4+AYg5Lk2l5vmZ++dy7rFWgYpXOhwsHApv82y3OKNlZ8oFbFvgXmAQgUIMPymOFSSBJw5nFUQkV0JmACKuFgxeFLCewMKhdYS/XFSMhZYcArbvwBDAMSBQkg3ATjcDFB+XJwqFobGHNddy8HoTqejIHGcv8bcleUZT57KmW1Vp7LXaMUR4qMQ4YBiE3gcVg4EBw0kUAcYA4mC4sAcZg5hwOYxacYEf5RB7X1tMEVAbpXAfNhcd45LjO88p6usCblccJ7lBzGhOZAXDOEAbhOKgOPAYgcyq0/JhFAMksYYgkmifC/E6pFNqY5CLBt8zYQwD4id5wG3yDmWCczKSBJ8MTmfgqtZsgmWOwMfypaLMOMP2GokqzQ2joTP/nq1miHPcYMAxA0czAoFpZtxOYIi/1AcaRNMBhc3vyX09ErCRo/sv5CAbaGAJlp1bvfigwDELeYF3vtQo+60Po4ukCQ0VtLxJhSxmV3EYSgDejbdP5dgAw8yIFfDghzeJ0MJHAM98RvFz0eCrDowUWd8HlIb3z/dfqm1KEko5YGAcGCc2qSLIAAAAABQq+Go5tBDoLFPVXJUIItlR+smGqGn+ps2Sl7ABMeUuBMPAFkmDAMQtJCRQbk8HmVAo5u8lZwLSPPkvMpefT82f85Cc97MlOKr7Djoj7EAHmx0TDANRAoSQfWblUKBYM26Dm2lWdqdI4MIvl0AcbRhlhcvv8aEsogMPZlhHFbihtOV8MAxC1G+hBP3N4n8lKDXNWc5D51IOoGdxv4z3M+5PnkVShbIQcPN6BVkAAAAAg4AFwB8NhzSoNzoMc1Ae/7Z55CGHj0gOG/ZVBjb5kbDqY2kAJh07WGAYhcGISKEGB5ugMBzAy6siAJf7fJjwuK0RhHzNZVR+wgMTX6bSg6ziiRsABwGAawuIjS+pXGfR01NwkZUcgqBlWc7hGLkov46etOFkWaw/S96WHnVAoTicDmbFwsBzOg4sA5CBciwHNCDmRCcyQHNILlWA5pgcpgOf8HlWDy1A6AQA=", "witness": null } From 482d0096ccfda4fb40d7b84e9fe77eb96b46a4ab Mon Sep 17 00:00:00 2001 From: Seth Schoen Date: Tue, 25 Aug 2026 16:42:38 -0700 Subject: [PATCH 3/3] Change name and comment for timelock Distance in last_will The 180 days value is applicable to Bitcoin (with a 10-minute blocktime), where we currently can't run this example contract. On Liquid, it is only 18 days. Instead of trying to switch to a Duration (which is the same unit for both), just add a comment highlighting the issue. This is already clearly discussed in the timelocks documentation, and I'll also note it for the pitfalls documentation. Fixed #396. --- examples/last_will.simf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/last_will.simf b/examples/last_will.simf index 13c5a42b..87c593ac 100644 --- a/examples/last_will.simf +++ b/examples/last_will.simf @@ -43,8 +43,9 @@ pub fn enforce_relative_distance(min_distance: Distance) { } fn inherit_spend(inheritor_sig: Signature) { - let days_180: Distance = 25920; - enforce_relative_distance(days_180); + // On Bitcoin, this Distance would be 180 days; on Liquid, it is 18 days. + let timelock_distance: Distance = 25920; + enforce_relative_distance(timelock_distance); let inheritor_pk: Pubkey = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798; // 1 * G checksig(inheritor_pk, inheritor_sig); }