diff --git a/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/environment/DarResources.scala b/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/environment/DarResources.scala index 7dd6a16e85..36eadc9f1a 100644 --- a/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/environment/DarResources.scala +++ b/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/environment/DarResources.scala @@ -2747,7 +2747,7 @@ object DarResources { ) val amulet_0_1_22 = DarResource( "splice-amulet-0.1.22.dar", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", PackageMetadata( PackageName.assertFromString("splice-amulet"), PackageVersion.assertFromString("0.1.22"), @@ -2808,7 +2808,7 @@ object DarResources { ) val amulet_current = DarResource( "splice-amulet-current.dar", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", PackageMetadata( PackageName.assertFromString("splice-amulet"), PackageVersion.assertFromString("0.1.22"), @@ -4241,19 +4241,22 @@ object DarResources { ) val dsoGovernance_0_1_28 = DarResource( "splice-dso-governance-0.1.28.dar", - "1e9d7cbb2000cb03ceca4082c695b9edba98a1338e6201277700b4ff204657d5", + "b9c1114fc340e3af9c8a60aa120a1bd197a3041aa39739048ac220cc8b047bee", PackageMetadata( PackageName.assertFromString("splice-dso-governance"), PackageVersion.assertFromString("0.1.28"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -4265,7 +4268,6 @@ object DarResources { "93c942ae2b4c2ba674fb152fe38473c507bda4e82b4e4c5da55a552a9d8cce1d", "3b25c9b08ac6d895417c604fc0ee4b7e47ef974ff8fa43f139daa43bb431fefc", "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", - "edee8f8372a58e52d47764943d908ada244a6b241fa19aa05005e2cfbc06a17e", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", @@ -4273,7 +4275,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -4282,8 +4283,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -4294,6 +4293,7 @@ object DarResources { "bfda48f9aa2c89c895cde538ec4b4946c7085959e031ad61bde616b9849155d7", "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", + "09e13cdb762746258527700fb538f517283dba19219eef9a0e43b62dae331b7b", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", @@ -4305,19 +4305,22 @@ object DarResources { ) val dsoGovernance_current = DarResource( "splice-dso-governance-current.dar", - "1e9d7cbb2000cb03ceca4082c695b9edba98a1338e6201277700b4ff204657d5", + "b9c1114fc340e3af9c8a60aa120a1bd197a3041aa39739048ac220cc8b047bee", PackageMetadata( PackageName.assertFromString("splice-dso-governance"), PackageVersion.assertFromString("0.1.28"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -4329,7 +4332,6 @@ object DarResources { "93c942ae2b4c2ba674fb152fe38473c507bda4e82b4e4c5da55a552a9d8cce1d", "3b25c9b08ac6d895417c604fc0ee4b7e47ef974ff8fa43f139daa43bb431fefc", "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", - "edee8f8372a58e52d47764943d908ada244a6b241fa19aa05005e2cfbc06a17e", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", @@ -4337,7 +4339,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -4346,8 +4347,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -4358,6 +4357,7 @@ object DarResources { "bfda48f9aa2c89c895cde538ec4b4946c7085959e031ad61bde616b9849155d7", "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", + "09e13cdb762746258527700fb538f517283dba19219eef9a0e43b62dae331b7b", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", @@ -5720,19 +5720,22 @@ object DarResources { ) val wallet_0_1_23 = DarResource( "splice-wallet-0.1.23.dar", - "2f515a6c27c52d4a0438f8b6d2651a33dfb705157165b45d347fc4dfb2b7ba10", + "43a7dc81c96ebe4947d3f5ae1da0628fc9a905029ee27c7c24da4ea17dd51dfe", PackageMetadata( PackageName.assertFromString("splice-wallet"), PackageVersion.assertFromString("0.1.23"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -5751,7 +5754,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -5760,8 +5762,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -5783,19 +5783,22 @@ object DarResources { ) val wallet_current = DarResource( "splice-wallet-current.dar", - "2f515a6c27c52d4a0438f8b6d2651a33dfb705157165b45d347fc4dfb2b7ba10", + "43a7dc81c96ebe4947d3f5ae1da0628fc9a905029ee27c7c24da4ea17dd51dfe", PackageMetadata( PackageName.assertFromString("splice-wallet"), PackageVersion.assertFromString("0.1.23"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -5814,7 +5817,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -5823,8 +5825,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -6967,19 +6967,22 @@ object DarResources { ) val amuletNameService_0_1_23 = DarResource( "splice-amulet-name-service-0.1.23.dar", - "edee8f8372a58e52d47764943d908ada244a6b241fa19aa05005e2cfbc06a17e", + "09e13cdb762746258527700fb538f517283dba19219eef9a0e43b62dae331b7b", PackageMetadata( PackageName.assertFromString("splice-amulet-name-service"), PackageVersion.assertFromString("0.1.23"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -6998,7 +7001,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -7007,8 +7009,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -7030,19 +7030,22 @@ object DarResources { ) val amuletNameService_current = DarResource( "splice-amulet-name-service-current.dar", - "edee8f8372a58e52d47764943d908ada244a6b241fa19aa05005e2cfbc06a17e", + "09e13cdb762746258527700fb538f517283dba19219eef9a0e43b62dae331b7b", PackageMetadata( PackageName.assertFromString("splice-amulet-name-service"), PackageVersion.assertFromString("0.1.23"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -7061,7 +7064,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -7070,8 +7072,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -8143,19 +8143,21 @@ object DarResources { ) val walletPayments_0_1_22 = DarResource( "splice-wallet-payments-0.1.22.dar", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", PackageMetadata( PackageName.assertFromString("splice-wallet-payments"), PackageVersion.assertFromString("0.1.22"), None, ), Set( + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -8182,8 +8184,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -8205,19 +8205,21 @@ object DarResources { ) val walletPayments_current = DarResource( "splice-wallet-payments-current.dar", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", PackageMetadata( PackageName.assertFromString("splice-wallet-payments"), PackageVersion.assertFromString("0.1.22"), None, ), Set( + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -8244,8 +8246,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -9387,19 +9387,22 @@ object DarResources { ) val splitwell_0_1_23 = DarResource( "splitwell-0.1.23.dar", - "a2132140a687424fcad90799736d6ff04e65ee050c72c741769e5ce48b3481b2", + "876ade9c4c1e56206f08656547d3ef6f3275e91856c4260a6b25640de44d6538", PackageMetadata( PackageName.assertFromString("splitwell"), PackageVersion.assertFromString("0.1.23"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -9418,7 +9421,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -9427,8 +9429,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", @@ -9450,19 +9450,22 @@ object DarResources { ) val splitwell_current = DarResource( "splitwell-current.dar", - "a2132140a687424fcad90799736d6ff04e65ee050c72c741769e5ce48b3481b2", + "876ade9c4c1e56206f08656547d3ef6f3275e91856c4260a6b25640de44d6538", PackageMetadata( PackageName.assertFromString("splitwell"), PackageVersion.assertFromString("0.1.23"), None, ), Set( + "d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80", + "edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e", "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", + "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "adc16315a8943a8433886694720a2a000ae84c2315c4414bd6d0db4d1660de9c", "dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea", "c3bb0c5d04799b3f11bad7c3c102963e115cf53da3e4afcbcfd9f06ebd82b4ff", @@ -9481,7 +9484,6 @@ object DarResources { "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", "54f85ebfc7dfae18f7d70370015dcc6c6792f60135ab369c44ae52c6fc17c274", "f181cd661f7af3a60bdaae4b0285a2a67beb55d6910fc8431dbae21a5825ec0f", - "4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c", "60c61c542207080e97e378ab447cc355ecc47534b3a3ebbff307c4fb8339bc4d", "6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35", "fcee8dfc1b81c449b421410edd5041c16ab59c45bbea85bcb094d1b17c3e9df7", @@ -9490,8 +9492,6 @@ object DarResources { "19f0df5fdaf5a96e137b6ea885fdb378f37bd3166bd9a47ee11518e33fa09a20", "a1fa18133ae48cbb616c4c148e78e661666778c3087d099067c7fe1868cbb3a1", "4b7ecfc366d79ccc5ed07c80f26fe489cf2dfd43ce2856c06a78e6a048db7032", - "2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120", - "bde4bd30749e99603e5afa354706608601029e225d4983324d617825b634253a", "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", diff --git a/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/store/db/ScanStoreTest.scala b/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/store/db/ScanStoreTest.scala index 220a8d562c..18cb4f6346 100644 --- a/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/store/db/ScanStoreTest.scala +++ b/apps/scan/src/test/scala/org/lfdecentralizedtrust/splice/store/db/ScanStoreTest.scala @@ -1600,6 +1600,7 @@ trait AmuletTransferUtil { self: StoreTestBase => domainMigrationId, extraTraffic, Optional.of(dsoParty.toProtoPrimitive), + Optional.empty(), ).toValue, mkAmuletRules_BuyMemberTrafficResult( round = round, @@ -1779,6 +1780,7 @@ trait AmuletTransferUtil { self: StoreTestBase => 1, numeric(1.0), numeric(1.0), + Optional.empty(), ) contract( diff --git a/apps/sv/src/test/scala/org/lfdecentralizedtrust/splice/store/db/SvDsoStoreTest.scala b/apps/sv/src/test/scala/org/lfdecentralizedtrust/splice/store/db/SvDsoStoreTest.scala index ba343fdae2..54c72d6ac3 100644 --- a/apps/sv/src/test/scala/org/lfdecentralizedtrust/splice/store/db/SvDsoStoreTest.scala +++ b/apps/sv/src/test/scala/org/lfdecentralizedtrust/splice/store/db/SvDsoStoreTest.scala @@ -2106,6 +2106,7 @@ abstract class SvDsoStoreTest extends StoreTestBase with HasExecutionContext { 1, numeric(1.0), numeric(1.0), + Optional.empty(), ) contract( diff --git a/daml/dars.lock b/daml/dars.lock index fe0eb2da73..7e3219e7ca 100644 --- a/daml/dars.lock +++ b/daml/dars.lock @@ -13,7 +13,7 @@ splice-amulet 0.1.19 90987abecbcb1d004b063ddfe3b4b5d46cf3814ce89114a86c8cd75ff3c splice-amulet 0.1.2 1446ffdf23326cef2de97923df96618eb615792bea36cf1431f03639448f1645 splice-amulet 0.1.20 23f47481dab6b1ec01339d6e14494d85bb2844c25f45b26fc5c9ef4cd4942d1f splice-amulet 0.1.21 73e9ffdb6b0bc19a5f67372b118103926da11547ab9109eccae47e4e4cc35d6f -splice-amulet 0.1.22 2f6846eac4af585ff9bb025538b1596e34372b834cf4876a3f339a81c02d7120 +splice-amulet 0.1.22 edba7f85c360058879e97e63f5d4725f37a04418730b7e55a26611cdbb42c28e splice-amulet 0.1.3 0d89016d5a90eb8bced48bbac99e81c57781b3a36094b8d48b8e4389851e19af splice-amulet 0.1.4 a36ef8888fb44caae13d96341ce1fabd84fc9e2e7b209bbc3caabb48b6be1668 splice-amulet 0.1.5 b4867a47abbfa2d15482f22c9c50516f0af14036287f299342f5d336391e4997 @@ -37,7 +37,7 @@ splice-amulet-name-service 0.1.2 711a2974d65e6ebd149704da75f3f71234798687ab895b9 splice-amulet-name-service 0.1.20 0b6748de2e613f5bc9a108b2496b85d2d661b7344c6c55eada9c0a0bf8efe0a5 splice-amulet-name-service 0.1.21 b342bbbd425902283c20eb5011eeab90cc9f69b4c534b8b757fd51b8ca7be589 splice-amulet-name-service 0.1.22 3921e7bd20670dce7530a84ad04b5f83860c21660bf1553908f76e95767c1950 -splice-amulet-name-service 0.1.23 edee8f8372a58e52d47764943d908ada244a6b241fa19aa05005e2cfbc06a17e +splice-amulet-name-service 0.1.23 09e13cdb762746258527700fb538f517283dba19219eef9a0e43b62dae331b7b splice-amulet-name-service 0.1.3 beb4b85f3f0cf36dfb93fc917d3ac218ee5d41b6e70604720cb228d85e168ee0 splice-amulet-name-service 0.1.4 053c7f4c2a77312e7d465a4fa7dc8cb298754ad12c0c987a7c401bd724e65efc splice-amulet-name-service 0.1.5 6188c8b5f612278f988fc95c11e9742993ad3ac6ad0809f9af06ee9d366dc4a8 @@ -45,8 +45,8 @@ splice-amulet-name-service 0.1.6 a208aab2c4a248ab2eff352bd382f8b3bbadc92464123db splice-amulet-name-service 0.1.7 ba7806d9b2d593eac74a050161c54ae1325d170bf175cb66a9c1e5e5ffb88c3d splice-amulet-name-service 0.1.8 efeb3f9b2b92e55fac4ec2d6164f95407a01477240c7465e576df4e310f54bd3 splice-amulet-name-service 0.1.9 f1b5915ad45ded616f43f83c735b7ee158b5eb58abe758a721e50eee19b3e531 -splice-amulet-name-service-test 0.1.27 9d595628e2092c626f8426f455a9a2eb52a69f1e5263478f995535c9f1acb885 -splice-amulet-test 0.1.26 3888a095572c524267443aab2d608808b3c1781a73c5ab8a03e747e918550590 +splice-amulet-name-service-test 0.1.27 a1bb59d0b5ae5fa514996d79bcc7ce111ce0db2a8c54d8e44bc6c5d96c888bae +splice-amulet-test 0.1.26 496db1496516eade430632eb35bb4d861fab39efee9b83e067fc696b2ee946dd splice-api-featured-app-v1 1.0.0 7804375fe5e4c6d5afe067bd314c42fe0b7d005a1300019c73154dd939da4dda splice-api-featured-app-v2 1.0.0 dd22e3e168a8c7fd0313171922dabf1f7a3b131bd9bfc9ff98e606f8c57707ea splice-api-reward-assignment-v1 1.0.0 6f7b72361bc2039369651b4195315a2a5849babafec67b3c96e66ea6e560ec35 @@ -86,7 +86,7 @@ splice-dso-governance 0.1.24 4974c654485d4ecaa6b5caf8ef3c2679efa8195c4b50d4965a8 splice-dso-governance 0.1.25 dfe102514acd41f79945b8363ca84d8243be97b2b235522ce77c754a36bb8479 splice-dso-governance 0.1.26 45099e955ce443f7895125097a62c509b9ad297091c91d6377ffe94f183c0e3e splice-dso-governance 0.1.27 014473d35514cb36583bdeca269386e46ae4e2283fe9b04beb2f53cdb408e1a2 -splice-dso-governance 0.1.28 1e9d7cbb2000cb03ceca4082c695b9edba98a1338e6201277700b4ff204657d5 +splice-dso-governance 0.1.28 b9c1114fc340e3af9c8a60aa120a1bd197a3041aa39739048ac220cc8b047bee splice-dso-governance 0.1.3 b0ae3cc03e418790305a3c15f761fe495572de5827f8d322fb8b96996b783c13 splice-dso-governance 0.1.4 dc24fd18b4d151cd1e0ff6bfb7438bafb2f50fe076d0f16f50565e60b153a0be splice-dso-governance 0.1.5 9e3ca1d22ad495dfabf3d61acae3dc1a7718f527f02092280b58cf69edfdc84c @@ -94,15 +94,15 @@ splice-dso-governance 0.1.6 4e7653cfbf7ca249de4507aca9cd3b91060e5489042a522c589d splice-dso-governance 0.1.7 d406eba1132d464605f4dae3edf8cf5ecbbb34bd8edef0e047e7e526d328718c splice-dso-governance 0.1.8 1790a114f83d5f290261fae1e7e46fba75a861a3dd603c6b4ef6b67b49053948 splice-dso-governance 0.1.9 9ee83bfd872f91e659b8a8439c5b4eaf240bcf6f19698f884d7d7993ab48c401 -splice-dso-governance-test 0.1.34 92b6e7f575a76902a497089aea9e63709d2d2e00317a2b0e9659eb6ad050f04b +splice-dso-governance-test 0.1.34 074503a48f5265065586731996dc8035d4fdb3fe9852ee584ecda545a5ec6dfa splice-test-token-v1 1.0.0 aaa0b576b5a3db49b3a4f7a4710fe6f8ae462aabbde4da89f639eb87fd62e90c -splice-test-token-v1-test 1.0.1 971061ba28c980e2f2236f53ba4c51f09ddd72cc1046020bcdc26286623548c0 +splice-test-token-v1-test 1.0.1 dc9412e09078779d65cc6a74b85a58656ae6669fc883eb5392004d245e1ab5c8 splice-test-token-v2 1.0.0 a38a96b6f46c14c599b2763bc4fc68911a9cada90f89c599a1401e8e3df685e1 -splice-test-token-v2-test 1.0.1 16a1a78766fb7f0ff9239d91c62fb45f07355c2b642067aaaca1dbcc16718342 +splice-test-token-v2-test 1.0.1 9a1aa4add2b167d026308b6481564eb4988feaf80f67009489b57649cca6178b splice-token-standard-utils 2.0.0 9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1 -splice-token-standard-utils-test 1.0.1 8afbd61be63d1e8d45dcd0a5813cf7700e3fbd7f37a55dd3aa6c44613ab13c1a -splice-token-standard-v1-test 1.0.16 40ddebf2b7644ba7b6e859c3b79790b119b3f51a3a385c9454f4dc93b7bfb379 -splice-token-standard-v2-test 1.0.1 ea8322f2908b7bab314c1ee1678a266602535139ea163b8c8a3f6d2554421455 +splice-token-standard-utils-test 1.0.1 4073020db30da788d027a866f3a90e5436aa35f42e5e78159eb8107f587cbf4f +splice-token-standard-v1-test 1.0.16 2e4a4546dd432878e45d5aa816690fa0663923eb53262e5781105df770d31460 +splice-token-standard-v2-test 1.0.1 cef43fcc9887291ca9522f5c03fee1120ad9b6f854842841398da262d07666a5 splice-token-test-dummy-holding 0.0.1 1cd171c6c42ab46dc9cf12d80c6111369e00cea5cdf054924b4f26ce94b1ef5b splice-token-test-dummy-holding 0.0.2 4f40fb033ef3db89623642c1b494e846097fa32af138b3864a63aa15937a323d splice-token-test-dummy-holding 0.0.3 26c72abb5a4b485e58f201021de6f9e525c85863fa115536f768d6ee138ef13e @@ -123,7 +123,7 @@ splice-util-batched-markers 1.0.0 727c5e97457d3ff841680816eb70d55834827ef756bac8 splice-util-batched-markers 1.0.1 4d91a9b044e0e996e91ee9aac3442591ffc78f16da4ff5c6f55218ba667f6192 splice-util-batched-markers 1.0.2 ec84eb67802403d91892aad61aee2e4eb34fb4e05e9158b3f677537569bcbc09 splice-util-batched-markers 1.0.3 74ee4c91b80c80b6860005ce627bdaed8f7fe6bdf3e60c9dbf3f48402d55126a -splice-util-batched-markers-test 1.0.9 1a9da132b7feb04699b164efa9abf14693c2fdffc3ec1235fee53e17f4a07c99 +splice-util-batched-markers-test 1.0.9 ade6824221f777e79f31c1a019f8500691d6d34bc91654a66a7247d94bc781d3 splice-util-featured-app-proxies 1.0.0 48e0c4fe4ea05e3b740404ebe37004ddd741efbdcd665c1c3199a5d6d9d944d7 splice-util-featured-app-proxies 1.1.0 81dd5a9e5c02d0de03208522a895fb85eeb12fbea4aca7c4ad0ad106f3b0bfce splice-util-featured-app-proxies 1.2.0 653c48879064332d34af5008bdfd8e349493460e67e62b85e8e7e3392831c842 @@ -131,11 +131,11 @@ splice-util-featured-app-proxies 1.2.1 06bab917848ef275317c2539b75c23b94e03ceb55 splice-util-featured-app-proxies 1.2.2 2889c094cf9678b2b666221934ea56ab169a31b257450845bd53217a8cdfe44f splice-util-featured-app-proxies 1.2.3 677ed3473e7d412c06520843790ff27e21aaa7c292208909579592351c8eb55d splice-util-featured-app-proxies 1.2.4 88bcea6e9990bb2edb5301c042caa25c0594742665866f049f7bd67342d0865d -splice-util-featured-app-proxies-test 1.0.15 6a0760f84e15e570c5fd4d1d11b0ca4f9073a70c1511900284971747c105b9dd +splice-util-featured-app-proxies-test 1.0.15 f6f0bc8f11676281f53e2a32b34b70fc8b17c215bc51f28518a4f564685ae8b3 splice-util-token-standard-wallet 1.0.0 1da198cb7968fa478cfa12aba9fdf128a63a8af6ab284ea6be238cf92a3733ac splice-util-token-standard-wallet 1.0.1 182892381e4245c39d3126082ec0b41a089edb61e63af518f61eae1f5c9e135a splice-util-token-standard-wallet 1.1.0 1215d3ee8f3cb428d062d8708c2deca33c91ff99f5edefa70616646e57f93012 -splice-util-token-standard-wallet-test 1.0.10 46fd8814bee9c866f79a0ae4fc5ddb008e66b806d21bc39509950fff73363778 +splice-util-token-standard-wallet-test 1.0.10 f5952153282dbb4ce2a706f735d0e17088ad3ebac8fea92628f46ed1d104cb8f splice-validator-lifecycle 0.1.0 cef96fac957362f1fc097120bd13686cac7f84fbc8053afa994a1f9214d9570c splice-validator-lifecycle 0.1.1 1ddf05c96002914593c929848b786f34c753fb0be07717d1786be177a564aada splice-validator-lifecycle 0.1.2 57e2f15f9755db1f00e51c52c319294264a21ad71c6bc1e7cd70db4b164c0aaa @@ -162,7 +162,7 @@ splice-wallet 0.1.2 c162e08a4ec0428bfa870b6d9040989e575c74199c3a80558c62e03196dd splice-wallet 0.1.20 e485c2eb59cca556e0e2ecfaaef45346dd0ba64f9976a3957938d814f846c78c splice-wallet 0.1.21 f799a58fa53dfe48bae52bd5dbcc2b578a7d4dfee3ae3f4eb7635fe9a8cc67d3 splice-wallet 0.1.22 a78daeeb1a4a2405828b29f8c04814725dbd97ee5a60bd02e839f32518640afa -splice-wallet 0.1.23 2f515a6c27c52d4a0438f8b6d2651a33dfb705157165b45d347fc4dfb2b7ba10 +splice-wallet 0.1.23 43a7dc81c96ebe4947d3f5ae1da0628fc9a905029ee27c7c24da4ea17dd51dfe splice-wallet 0.1.3 2c35bb4f5084ea66db59717d21750bfd64c43147ef5fd5166615092d592a6917 splice-wallet 0.1.4 141dad2d33b6410b8e1c35a0c4f8f76cb691e4d9a4410ce89f33f373855317e1 splice-wallet 0.1.5 614b525a50c624062d851ce7df5bdb90ddfa0d6871c486cb6e2c7b694bfbce59 @@ -185,7 +185,7 @@ splice-wallet-payments 0.1.19 eae5715f0ddd5ff4b8000cff13191b76d34e5d80d05465de92 splice-wallet-payments 0.1.2 775f5eb9c0249509adda5eb3ea4ee31bb953601168c18880df6f2ff09ec4298a splice-wallet-payments 0.1.20 340afccb702179069fc81044890c435c5c8565df061b2efbfccf618c33a04e37 splice-wallet-payments 0.1.21 dc1a2f4ff4774e00c388f1bfce48a23c3539b8ea0d0ebf99b8df840a058ef873 -splice-wallet-payments 0.1.22 4348c5a3316d2ba3d17b67e203e95a922d9eeba526ef9b2b2218cf2ae532758c +splice-wallet-payments 0.1.22 d62178869d153fc68c5d98173e940e933f18b1ab39d4508950618cb7863e3c80 splice-wallet-payments 0.1.3 b953b3729c81a55e598a364be7d0c0574750df3de12a7a1b53a300f217cb5c5c splice-wallet-payments 0.1.4 12177f54873c1094ea169874ad0d7838383fd137f302d16356e93f28dfbc0fcc splice-wallet-payments 0.1.5 2177b7a579fe6d3d510c7bcda99d39ece104ae24cfd1b78ac5616990d2d6c675 @@ -193,7 +193,7 @@ splice-wallet-payments 0.1.6 6124379528eeb6fa17ecdab15577c29abb33d0c0d34dc5f2680 splice-wallet-payments 0.1.7 4e3e0d9cdadf80f4bf8f3cd3660d5287c084c9a29f23c901aabce597d72fd467 splice-wallet-payments 0.1.8 e48ea337ee3335c8bb3206a2501ce947ac1a7bdb1825cee8f28bad64f5a7bc4b splice-wallet-payments 0.1.9 7f4e081ad96f2ccded0c053b0cf5ddddae1139dfc3bb89cefcf77ea70f2cecb7 -splice-wallet-test 0.1.27 21669b4dff108336a6b7cb4afc905b4bb3f30163fce70989609fe931ed57756c +splice-wallet-test 0.1.27 b8a489de8c2410f89cbf8bbb86917f4c6efae1fc53ee4b8cbd641e4e17590a28 splitwell 0.1.0 075c76de553ab88383a7c69de134afa82aacfdf8ea8fcfe8852c4b199c3b2669 splitwell 0.1.1 ccb1a0215053062202052e1a052f9214da3fdae5253a6d43e2e155ff4f57fe75 splitwell 0.1.10 d42676a366f7ca7a2409974dd3054aa4d83ab29baa3b2086ad021407b0a1a295 @@ -210,7 +210,7 @@ splitwell 0.1.2 778edd2c228c6b68198d4d033885b2d0dae7daaee55d7df3edd9dfdf1f10fbd0 splitwell 0.1.20 af686139dda12540ab05a292987f5fa2edd0c05af62d9651384d005e9a91043e splitwell 0.1.21 f646cf275b4c5139711469c92fbe702c498614edf200d8085305b2e43e28936a splitwell 0.1.22 b97352bf1b70f6be481d7cd2b4ce22396008bbf611b488243a694f30437ed3a9 -splitwell 0.1.23 a2132140a687424fcad90799736d6ff04e65ee050c72c741769e5ce48b3481b2 +splitwell 0.1.23 876ade9c4c1e56206f08656547d3ef6f3275e91856c4260a6b25640de44d6538 splitwell 0.1.3 7cde068cde689584f86a2499689d5cb165264d96496721e24ac6fb909f770a58 splitwell 0.1.4 85557b86cd4f330f093915db1ea26eac5092de6b5ddae0690146f6059c89419b splitwell 0.1.5 a68e78774a7be655f5744c8ae0ac8b46d55ef6d1e7661bc27b9296154d56ac74 @@ -218,4 +218,4 @@ splitwell 0.1.6 872da0dd7986fd768930f85d6a7310a94a0ef924e7fbb7bb7a4e149f2b5feb74 splitwell 0.1.7 841d1c9c86b5c8f3a39059459ecd8febedf7703e18f117300bb0ebf4423db096 splitwell 0.1.8 63b8153a08ceb4bf40d807acc5712372c3eac548c266be4d5e92470b4f655515 splitwell 0.1.9 b6267905698d2798b9ef171e27d49fb88e052ec0ec0e0675a3a1b275c7d037d4 -splitwell-test 0.1.27 4cade4cf6fd75fd5f255bbb187ef1a491c717364e111022dfec6b9f68c64e8b1 \ No newline at end of file +splitwell-test 0.1.27 b2c94b16111a95f0f00b75ede1fd6ef4525ce0df303e21435fa779e4eb81a071 \ No newline at end of file diff --git a/daml/dars/splice-amulet-0.1.22.dar b/daml/dars/splice-amulet-0.1.22.dar index 9898446f79..74f6f25600 100644 Binary files a/daml/dars/splice-amulet-0.1.22.dar and b/daml/dars/splice-amulet-0.1.22.dar differ diff --git a/daml/dars/splice-amulet-name-service-0.1.23.dar b/daml/dars/splice-amulet-name-service-0.1.23.dar index 5d22cd9cf1..808f82e3c7 100644 Binary files a/daml/dars/splice-amulet-name-service-0.1.23.dar and b/daml/dars/splice-amulet-name-service-0.1.23.dar differ diff --git a/daml/dars/splice-dso-governance-0.1.28.dar b/daml/dars/splice-dso-governance-0.1.28.dar index 10ce94494a..b2cc3f259c 100644 Binary files a/daml/dars/splice-dso-governance-0.1.28.dar and b/daml/dars/splice-dso-governance-0.1.28.dar differ diff --git a/daml/dars/splice-wallet-0.1.23.dar b/daml/dars/splice-wallet-0.1.23.dar index 5b56609406..5d4e831e98 100644 Binary files a/daml/dars/splice-wallet-0.1.23.dar and b/daml/dars/splice-wallet-0.1.23.dar differ diff --git a/daml/dars/splice-wallet-payments-0.1.22.dar b/daml/dars/splice-wallet-payments-0.1.22.dar index 1a0755ff59..3edace18e1 100644 Binary files a/daml/dars/splice-wallet-payments-0.1.22.dar and b/daml/dars/splice-wallet-payments-0.1.22.dar differ diff --git a/daml/dars/splitwell-0.1.23.dar b/daml/dars/splitwell-0.1.23.dar index d6c547e845..b927bd845c 100644 Binary files a/daml/dars/splitwell-0.1.23.dar and b/daml/dars/splitwell-0.1.23.dar differ diff --git a/daml/splice-amulet-test/daml/Splice/Scripts/TestBuyRegisteredSyncTraffic.daml b/daml/splice-amulet-test/daml/Splice/Scripts/TestBuyRegisteredSyncTraffic.daml new file mode 100644 index 0000000000..7b5ba5cf45 --- /dev/null +++ b/daml/splice-amulet-test/daml/Splice/Scripts/TestBuyRegisteredSyncTraffic.daml @@ -0,0 +1,309 @@ +-- Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- | PoC (registered-synchronizer traffic), rung 2: buy extra traffic for a governance-registered +-- synchronizer through the existing `AmuletRules_BuyMemberTraffic` choice, authorized by a +-- disclosed `RegisteredSynchronizer` instead of the `requiredSynchronizers` gate, and assert the +-- resulting `MemberTraffic` record is observed by the synchronizer's operator. +-- +-- Rung 1 (`TestRegisterSynchronizer`, in the DSO governance test package) proves the registration +-- is created by a vote. Here we create the `RegisteredSynchronizer` directly as the DSO party to +-- isolate the buy path. +module Splice.Scripts.TestBuyRegisteredSyncTraffic where + +import DA.Assert + +import Daml.Script + +-- The extended buy choice, the merge choice, and `TransferInput`/`InputAmulet`/`TransferContext`. +import Splice.AmuletRules +-- The registry contract (rung 1) and the purchase record the buy choice creates. +import Splice.DecentralizedSynchronizer (RegisteredSynchronizer(..), MemberTraffic(..)) + +-- App + user + round + funding helpers (setupDefaultAppWithUsers, tap, getTransferContext, ...). +import Splice.Scripts.Util + +-- | The synchronizer id that `setupDefaultAppWithUsers` puts into `requiredSynchronizers` +-- (see `defaultAmuletConfig` in `Splice.Testing.Registries.AmuletRegistry.Parameters`). +decentralizedSyncId : Text +decentralizedSyncId = "decentralized-synchronizer-id-0" + +-- | Happy path: a registered (non-required) synchronizer can have traffic bought for it through +-- the plain member-traffic buy; the burn is unchanged and the created `MemberTraffic` carries +-- the registration's operator as an observer. +test_BuyRegisteredSyncTraffic : Script () +test_BuyRegisteredSyncTraffic = do + d <- setupDefaultAppWithUsers + let app = d.app + let provider = d.provider1 + -- Ensure an open mining round exists to price the traffic against. + runNextIssuance app + + -- The registered synchronizer's operator, plus a synchronizer id that is deliberately NOT in + -- `requiredSynchronizers` (which today holds only the decentralized sync) - authorization comes + -- from the registration instead. + operator <- allocateParty "registeredSyncOperator" + let registeredSyncId = "registered-sync::1220dededededededededededededededededededededededededededededede" + + -- Rung 1 creates this via a DSO governance vote; here we create it directly as the DSO party to isolate rung 2. + registeredCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = registeredSyncId + operator + + -- Fund the buyer with Amulet to burn, and build a standard transfer context. + amuletCid <- tap app provider 1_000_000.0 + context <- getTransferContext app provider None + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + let memberId = "PAR::participant::1220abababababababababababababababababababababababababababababab" + -- Buy traffic for the registered synchronizer. `readAs app.dso` gives the buyer visibility of + -- the AmuletRules / OpenMiningRound / RegisteredSynchronizer (all signed by the DSO party) + -- in-script; on a live ledger these are supplied via explicit disclosure. + result <- submit (actAs provider.primaryParty <> readAs app.dso) $ + exerciseCmd amuletRulesCid AmuletRules_BuyMemberTraffic with + inputs = [InputAmulet amuletCid] + context + provider = provider.primaryParty + memberId + synchronizerId = registeredSyncId + migrationId = 0 + trafficAmount = 1_000_000 + expectedDso = Some app.dso + optRegisteredSynchronizer = Some registeredCid + + -- The purchase burned Amulet... + assertMsg "expected a non-zero Amulet burn" (result.amuletPaid > 0.0) + -- ...and recorded a MemberTraffic whose operator observer is drawn from the registration. + Some mt <- queryContractId app.dso result.purchasedTraffic + mt.dso === app.dso + mt.operator === Some operator + mt.synchronizerId === registeredSyncId + mt.memberId === memberId + mt.totalPurchased === 1_000_000 + + -- The operator is an observer, so its node can pick up the purchase on-ledger. + operatorView <- query @MemberTraffic operator + length operatorView === 1 + +-- | Regression: without a registration, the choice behaves exactly as before - buying for the +-- decentralized synchronizer succeeds (with no operator observer), buying for an unknown +-- synchronizer id fails on the `requiredSynchronizers` gate. +test_BuyMemberTraffic_withoutRegistrationUnchanged : Script () +test_BuyMemberTraffic_withoutRegistrationUnchanged = do + d <- setupDefaultAppWithUsers + let app = d.app + let provider = d.provider1 + runNextIssuance app + + amuletCid <- tap app provider 1_000_000.0 + context <- getTransferContext app provider None + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + let memberId = "PAR::participant::1220abababababababababababababababababababababababababababababab" + result <- submit (actAs provider.primaryParty <> readAs app.dso) $ + exerciseCmd amuletRulesCid AmuletRules_BuyMemberTraffic with + inputs = [InputAmulet amuletCid] + context + provider = provider.primaryParty + memberId + synchronizerId = decentralizedSyncId + migrationId = 0 + trafficAmount = 1_000_000 + expectedDso = Some app.dso + optRegisteredSynchronizer = None + Some mt <- queryContractId app.dso result.purchasedTraffic + mt.operator === None + + -- An id that is neither required nor registered is still rejected. + amuletCid2 <- tap app provider 1_000_000.0 + context2 <- getTransferContext app provider None + submitMustFail (actAs provider.primaryParty <> readAs app.dso) $ + exerciseCmd amuletRulesCid AmuletRules_BuyMemberTraffic with + inputs = [InputAmulet amuletCid2] + context = context2 + provider = provider.primaryParty + memberId + synchronizerId = "unregistered-sync::1220bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe" + migrationId = 0 + trafficAmount = 1_000_000 + expectedDso = Some app.dso + optRegisteredSynchronizer = None + +-- | Negative: a registration only authorizes its own synchronizer id - passing it together with a +-- different synchronizer id is rejected. +test_BuyRegisteredSyncTraffic_synchronizerIdMismatch : Script () +test_BuyRegisteredSyncTraffic_synchronizerIdMismatch = do + d <- setupDefaultAppWithUsers + let app = d.app + let provider = d.provider1 + runNextIssuance app + + operator <- allocateParty "registeredSyncOperator" + registeredCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = "registered-sync::1220cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" + operator + + amuletCid <- tap app provider 1_000_000.0 + context <- getTransferContext app provider None + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + submitMustFail (actAs provider.primaryParty <> readAs app.dso) $ + exerciseCmd amuletRulesCid AmuletRules_BuyMemberTraffic with + inputs = [InputAmulet amuletCid] + context + provider = provider.primaryParty + memberId = "PAR::participant::1220efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef" + synchronizerId = "registered-sync::1220differentdifferentdifferentdifferentdifferentdifferentdiffe" + migrationId = 0 + trafficAmount = 1_000_000 + expectedDso = Some app.dso + optRegisteredSynchronizer = Some registeredCid + +-- | Negative: the `minTopupAmount` floor still applies even though the `requiredSynchronizers` +-- gate is replaced for registered synchronizers - a tiny purchase is rejected. +test_BuyRegisteredSyncTraffic_belowMinTopup : Script () +test_BuyRegisteredSyncTraffic_belowMinTopup = do + d <- setupDefaultAppWithUsers + let app = d.app + let provider = d.provider1 + runNextIssuance app + + operator <- allocateParty "registeredSyncOperator" + let registeredSyncId = "registered-sync::1220cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd" + registeredCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = registeredSyncId + operator + + amuletCid <- tap app provider 1_000_000.0 + context <- getTransferContext app provider None + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + submitMustFail (actAs provider.primaryParty <> readAs app.dso) $ + exerciseCmd amuletRulesCid AmuletRules_BuyMemberTraffic with + inputs = [InputAmulet amuletCid] + context + provider = provider.primaryParty + memberId = "PAR::participant::1220efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef" + synchronizerId = registeredSyncId + migrationId = 0 + trafficAmount = 1 -- below any sane minTopupAmount + expectedDso = Some app.dso + optRegisteredSynchronizer = Some registeredCid + +-- | Negative: a registered synchronizer has no migration history — its purchases must carry +-- `migrationId = 0`. A non-zero id is rejected (it would create a record the operator's +-- reconciler never counts). +test_BuyRegisteredSyncTraffic_nonZeroMigrationId : Script () +test_BuyRegisteredSyncTraffic_nonZeroMigrationId = do + d <- setupDefaultAppWithUsers + let app = d.app + let provider = d.provider1 + runNextIssuance app + + operator <- allocateParty "registeredSyncOperator" + let registeredSyncId = "registered-sync::1220adadadadadadadadadadadadadadadadadadadadadadadadadadadadadad" + registeredCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = registeredSyncId + operator + + amuletCid <- tap app provider 1_000_000.0 + context <- getTransferContext app provider None + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + submitMustFail (actAs provider.primaryParty <> readAs app.dso) $ + exerciseCmd amuletRulesCid AmuletRules_BuyMemberTraffic with + inputs = [InputAmulet amuletCid] + context + provider = provider.primaryParty + memberId = "PAR::participant::1220efefefefefefefefefefefefefefefefefefefefefefefefefefefefefef" + synchronizerId = registeredSyncId + migrationId = 1 -- registered synchronizers must use migrationId 0 + trafficAmount = 1_000_000 + expectedDso = Some app.dso + optRegisteredSynchronizer = Some registeredCid + +-- | Negative: the expected DSO party argument guards against a swapped-out AmuletRules. A +-- mismatched expected DSO party (here, a party that is not the DSO party) is rejected before +-- any Amulet burn. +test_BuyRegisteredSyncTraffic_wrongExpectedDso : Script () +test_BuyRegisteredSyncTraffic_wrongExpectedDso = do + d <- setupDefaultAppWithUsers + let app = d.app + let provider = d.provider1 + runNextIssuance app + + operator <- allocateParty "registeredSyncOperator" + let registeredSyncId = "registered-sync::1220bcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbc" + registeredCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = registeredSyncId + operator + + amuletCid <- tap app provider 1_000_000.0 + context <- getTransferContext app provider None + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + submitMustFail (actAs provider.primaryParty <> readAs app.dso) $ + exerciseCmd amuletRulesCid AmuletRules_BuyMemberTraffic with + inputs = [InputAmulet amuletCid] + context + provider = provider.primaryParty + memberId = "PAR::participant::1220ababababababababababababababababababababababababababababab" + synchronizerId = registeredSyncId + migrationId = 0 + trafficAmount = 1_000_000 + expectedDso = Some provider.primaryParty -- not the DSO party + optRegisteredSynchronizer = Some registeredCid + +-- | Negative: `RegisteredSynchronizer` requires a non-empty synchronizer id (template `ensure`). +test_RegisteredSynchronizer_ensureNonEmpty : Script () +test_RegisteredSynchronizer_ensureNonEmpty = do + d <- setupDefaultAppWithUsers + let app = d.app + operator <- allocateParty "registeredSyncOperator" + submitMustFail app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = "" + operator + +-- | Merging member traffic preserves the operator observer, and refuses to merge contracts whose +-- operators disagree. +test_MergeMemberTraffic_operatorPreserved : Script () +test_MergeMemberTraffic_operatorPreserved = do + d <- setupDefaultAppWithUsers + let app = d.app + operator <- allocateParty "registeredSyncOperator" + let registeredSyncId = "registered-sync::1220dededededededededededededededededededededededededededededede" + let memberId = "PAR::participant::1220abababababababababababababababababababababababababababababab" + let mkTraffic op purchased = MemberTraffic with + dso = app.dso + memberId + synchronizerId = registeredSyncId + migrationId = 0 + totalPurchased = purchased + numPurchases = 1 + amuletSpent = 1.0 + usdSpent = 1.0 + operator = op + + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + -- Same operator on both: the merge succeeds and the merged record keeps the operator. + cid1 <- submit app.dso $ createCmd (mkTraffic (Some operator) 1_000_000) + cid2 <- submit app.dso $ createCmd (mkTraffic (Some operator) 2_000_000) + result <- submit app.dso $ exerciseCmd amuletRulesCid AmuletRules_MergeMemberTrafficContracts with + trafficCids = [cid1, cid2] + Some merged <- queryContractId app.dso result.mergedTrafficCid + merged.operator === Some operator + merged.totalPurchased === 3_000_000 + merged.numPurchases === 2 + + -- Disagreeing operators: the merge is rejected. + cid3 <- submit app.dso $ createCmd (mkTraffic (Some operator) 1_000_000) + cid4 <- submit app.dso $ createCmd (mkTraffic None 1_000_000) + submitMustFail app.dso $ exerciseCmd amuletRulesCid AmuletRules_MergeMemberTrafficContracts with + trafficCids = [cid3, cid4] diff --git a/daml/splice-amulet/daml/Splice/AmuletRules.daml b/daml/splice-amulet/daml/Splice/AmuletRules.daml index f1292fa96f..2b1bfd2ed5 100644 --- a/daml/splice-amulet/daml/Splice/AmuletRules.daml +++ b/daml/splice-amulet/daml/Splice/AmuletRules.daml @@ -276,14 +276,27 @@ template AmuletRules -- Party that the sender expects to represent the DSO party of the AmuletRules contract they are calling. -- Must always be set to protect from malicious delegees swapping the AmuletRules contract out for -- one under their control. + optRegisteredSynchronizer : Optional (ContractId RegisteredSynchronizer) + -- For traffic on a governance-registered synchronizer (see `RegisteredSynchronizer`): the + -- registration authorizing it, supplied via explicit disclosure. It replaces the + -- `requiredSynchronizers` gate for the given synchronizer id, and its `operator` becomes an + -- observer of the created `MemberTraffic`. `None` buys traffic on the decentralized + -- synchronizer. controller provider do checkExpectedDso dso expectedDso + -- For a governance-registered synchronizer, the disclosed registration both authorizes the + -- synchronizer id and names the operator that observes the purchase record. + -- `RegisteredSynchronizer_Fetch` lets `provider` read a contract it is not a stakeholder of, + -- mirroring how `computeSynchronizerFees` reads the OpenMiningRound. + optRegistered <- forA optRegisteredSynchronizer $ \registeredCid -> + fetchPublicReferenceData (ForDso dso) registeredCid (RegisteredSynchronizer_Fetch provider) -- validate choice parameters configUsd <- getValueAsOfLedgerTime configSchedule - case validateBuyMemberTrafficInputs configUsd synchronizerId trafficAmount of + case validateBuyMemberTrafficInputs configUsd optRegistered synchronizerId migrationId trafficAmount of Left failureStatus -> failWithStatus failureStatus Right _ -> pure () + let optOperator = fmap (\registered -> registered.operator) optRegistered (trafficCostAmulet, trafficCostUsd) <- computeSynchronizerFees dso provider trafficAmount this context (transferResult, meta) <- splitAndBurn (toInterfaceContractId self) provider trafficCostAmulet inputs context dso "traffic purchase" -- create a new MemberTraffic contract for the purchased traffic @@ -296,6 +309,7 @@ template AmuletRules numPurchases = 1 amuletSpent = trafficCostAmulet usdSpent = trafficCostUsd + operator = optOperator -- return result return AmuletRules_BuyMemberTrafficResult with round = transferResult.round @@ -305,7 +319,6 @@ template AmuletRules senderChangeAmulet = transferResult.senderChangeAmulet meta = Some meta - nonconsuming choice AmuletRules_MergeMemberTrafficContracts : AmuletRules_MergeMemberTrafficContractsResult with trafficCids : [ContractId MemberTraffic] @@ -322,6 +335,11 @@ template AmuletRules migrationId = first.migrationId fetchAndArchive expectedTrafficContract trafficCid let traffics = first::rest + -- defence in depth: contracts for the same synchronizer always name the same operator, so + -- this never triggers unless duplicate registrations exist; refusing the merge keeps a + -- mixed-operator set visible instead of silently blending it + require "Operator matches across all merged member traffic contracts" + (all (\traffic -> traffic.operator == first.operator) traffics) -- create a new aggregated member traffic contract. let mergedTraffic = foldl (\acc traffic -> MemberTraffic with @@ -333,7 +351,8 @@ template AmuletRules numPurchases = acc.numPurchases + traffic.numPurchases usdSpent = acc.usdSpent + traffic.usdSpent amuletSpent = acc.amuletSpent + traffic.amuletSpent - ) (initialMemberTraffic dso first.memberId first.synchronizerId first.migrationId) traffics + operator = acc.operator + ) (initialMemberTraffic dso first.memberId first.synchronizerId first.migrationId first.operator) traffics mergedTrafficCid <- create mergedTraffic return AmuletRules_MergeMemberTrafficContractsResult with .. @@ -1067,6 +1086,24 @@ mkInsufficientTopupAmountFailure requestedAmount minAmount = , ("minTopupAmount", show minAmount) ]) +mkRegisteredSynchronizerMismatchFailure : Text -> Text -> FailureStatus +mkRegisteredSynchronizerMismatchFailure registeredId requestedId = + mkFailureStatus + (spliceErrorId "registered-synchronizer-mismatch") + InvalidIndependentOfSystemState + ("The disclosed registration is for synchronizer " <> registeredId + <> " but the purchase names synchronizer " <> requestedId) + (TextMap.fromList [("registeredSynchronizerId", registeredId), ("synchronizerId", requestedId)]) + +mkNonZeroMigrationIdFailure : Int -> FailureStatus +mkNonZeroMigrationIdFailure migrationId = + mkFailureStatus + (spliceErrorId "non-zero-migration-id") + InvalidIndependentOfSystemState + ("Traffic for a registered synchronizer must be bought with migrationId 0, got " + <> show migrationId) + (TextMap.fromList [("migrationId", show migrationId)]) + mkMaximumInputsExceededFailure : FailureStatus mkMaximumInputsExceededFailure = mkFailureStatus @@ -1715,13 +1752,32 @@ transferConfigAmuletFromExternalPartyConfigState : ExternalPartyConfigState -> T transferConfigAmuletFromExternalPartyConfigState externalPartyConfigState = scaleFees2 (1.0 / externalPartyConfigState.amuletPrice) externalPartyConfigState.transferConfig -validateBuyMemberTrafficInputs : AmuletConfig Unit.USD -> Text -> Int -> Either FailureStatus () -validateBuyMemberTrafficInputs configUsd synchronizerId trafficAmount - | not (synchronizerId `Set.member` configUsd.decentralizedSynchronizer.requiredSynchronizers) = - Left $ mkUnknownSynchronizerFailure synchronizerId - | trafficAmount < configUsd.decentralizedSynchronizer.fees.minTopupAmount = - Left $ mkInsufficientTopupAmountFailure trafficAmount configUsd.decentralizedSynchronizer.fees.minTopupAmount - | otherwise = Right () +-- All validation for buying member traffic, for both the decentralized synchronizer and +-- governance-registered synchronizers. The synchronizer authorization is checked first (matching +-- the failure precedence callers observed before registrations existed), then the `minTopupAmount` +-- floor, which applies in all cases: +-- * without a registration, the synchronizer id must be in `requiredSynchronizers`; +-- * with a registration, the synchronizer id must match the registration's, and `migrationId` +-- must be 0 (migration ids exist for the decentralized synchronizer's history of migrations +-- with downtime; registered synchronizers always use 0). +validateBuyMemberTrafficInputs : AmuletConfig Unit.USD -> Optional RegisteredSynchronizer -> Text -> Int -> Int -> Either FailureStatus () +validateBuyMemberTrafficInputs configUsd optRegistered synchronizerId migrationId trafficAmount = + case optRegistered of + None + | not (synchronizerId `Set.member` configUsd.decentralizedSynchronizer.requiredSynchronizers) -> + Left $ mkUnknownSynchronizerFailure synchronizerId + | otherwise -> validateTopupAmount + Some registered + | registered.synchronizerId /= synchronizerId -> + Left $ mkRegisteredSynchronizerMismatchFailure registered.synchronizerId synchronizerId + | migrationId /= 0 -> + Left $ mkNonZeroMigrationIdFailure migrationId + | otherwise -> validateTopupAmount + where + validateTopupAmount + | trafficAmount < configUsd.decentralizedSynchronizer.fees.minTopupAmount = + Left $ mkInsufficientTopupAmountFailure trafficAmount configUsd.decentralizedSynchronizer.fees.minTopupAmount + | otherwise = Right () -- | Computing synchronizer fees computeSynchronizerFees : Party -> Party -> Int -> AmuletRules -> TransferContext -> Update (Decimal, Decimal) diff --git a/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml b/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml index ac25d755e0..ff9c310211 100644 --- a/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml +++ b/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml @@ -4,6 +4,7 @@ -- | Types and contracts for managing synchronizer fees module Splice.DecentralizedSynchronizer where +import DA.Optional (optionalToList) import qualified DA.Set as Set import DA.Text as T import DA.Time @@ -64,8 +65,14 @@ template MemberTraffic with numPurchases : Int -- ^ Number of times extra traffic has been purchased amuletSpent : Decimal -- ^ Total Amulet spent on extra traffic usdSpent : Decimal -- ^ Total USD spent on extra traffic + operator : Optional Party + -- ^ For traffic purchased for a governance-registered synchronizer (see + -- `RegisteredSynchronizer`): its operator, made an observer of this contract so the + -- operator's node can ingest the purchase on-ledger. `None` for traffic on the + -- decentralized synchronizer itself. where signatory dso + observer (optionalToList operator) ensure totalPurchased >= 0 && numPurchases >= 0 @@ -76,8 +83,8 @@ template MemberTraffic with && not (T.isEmpty synchronizerId) -initialMemberTraffic : Party -> Text -> Text -> Int -> MemberTraffic -initialMemberTraffic dso memberId synchronizerId migrationId = MemberTraffic with +initialMemberTraffic : Party -> Text -> Text -> Int -> Optional Party -> MemberTraffic +initialMemberTraffic dso memberId synchronizerId migrationId operator = MemberTraffic with dso memberId migrationId @@ -86,6 +93,7 @@ initialMemberTraffic dso memberId synchronizerId migrationId = MemberTraffic wit numPurchases = 0 amuletSpent = 0.0 usdSpent = 0.0 + operator data ForMemberTraffic = ForMemberTraffic with dso : Party @@ -111,9 +119,10 @@ instance HasCheckedFetch MemberTraffic ForMemberTraffic where -- -- The registration binds a stable synchronizer id to the `operator` party that runs it. Two -- consumers read it: --- * `AmuletRules_BuyDedicatedSyncTraffic` (splice-amulet) authorizes an Amulet burn for a --- synchronizer id only if a matching `RegisteredSynchronizer` is supplied (via explicit --- disclosure), and uses `operator` as the observer of the resulting traffic record. +-- * `AmuletRules_BuyMemberTraffic` (splice-amulet) accepts a matching `RegisteredSynchronizer` +-- (via explicit disclosure) as authorization for a synchronizer id outside +-- `requiredSynchronizers`, and sets its `operator` as an observer on the `MemberTraffic` +-- it creates. -- * the `operator` itself, which observes this contract and thus learns it is registered. -- -- This template lives in splice-amulet (not the governance package) so that `AmuletRules` can @@ -125,7 +134,7 @@ template RegisteredSynchronizer with -- ^ Id of the dedicated synchronizer this registration authorizes Amulet-funded traffic for. operator : Party -- ^ The party operating the dedicated synchronizer. Observes this registration and every - -- traffic purchase for its synchronizer (see `DedicatedSyncTraffic`). + -- traffic purchase for its synchronizer (via the `operator` field on `MemberTraffic`). where signatory dso observer operator @@ -133,7 +142,7 @@ template RegisteredSynchronizer with ensure not (T.isEmpty synchronizerId) -- Public read choice, mirroring OpenMiningRound_Fetch: lets a buyer who is neither - -- signatory nor observer read this contract inside AmuletRules_BuyDedicatedSyncTraffic + -- signatory nor observer read this contract inside AmuletRules_BuyMemberTraffic -- when it is passed via explicit disclosure. Returns the contract unchanged. -- (Plain comment, not a `-- |` doc comment: damlc docs rejects a doc comment attached -- directly to a choice.) diff --git a/daml/splice-wallet/daml/Splice/Wallet/BuyTrafficRequest.daml b/daml/splice-wallet/daml/Splice/Wallet/BuyTrafficRequest.daml index 8dba3b661c..c51b81ba9f 100644 --- a/daml/splice-wallet/daml/Splice/Wallet/BuyTrafficRequest.daml +++ b/daml/splice-wallet/daml/Splice/Wallet/BuyTrafficRequest.daml @@ -59,6 +59,7 @@ template BuyTrafficRequest migrationId trafficAmount expectedDso = Some dso + optRegisteredSynchronizer = None let trackingInfo = BuyTrafficRequestTrackingInfo with .. pure BuyTrafficRequest_CompleteResult with purchasedTraffic = result.purchasedTraffic diff --git a/daml/splice-wallet/daml/Splice/Wallet/Install.daml b/daml/splice-wallet/daml/Splice/Wallet/Install.daml index 6a64a9c485..cf1561757b 100644 --- a/daml/splice-wallet/daml/Splice/Wallet/Install.daml +++ b/daml/splice-wallet/daml/Splice/Wallet/Install.daml @@ -195,6 +195,7 @@ executeAmuletOperationRec executionContext inputs prevResults (operation::remain migrationId trafficAmount expectedDso = Some executionContext.dso + optRegisteredSynchronizer = None pure (result.purchasedTraffic, result.senderChangeAmulet) handleCreateExternalPartySetupProposal : ExecutionContext -> Party -> Time -> Update (ContractId ExternalPartySetupProposal, [TransferInput])