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 beba1c50fa..02f35b1048 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", - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", PackageMetadata( PackageName.assertFromString("splice-amulet"), PackageVersion.assertFromString("0.1.22"), @@ -2808,7 +2808,7 @@ object DarResources { ) val amulet_current = DarResource( "splice-amulet-current.dar", - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", PackageMetadata( PackageName.assertFromString("splice-amulet"), PackageVersion.assertFromString("0.1.22"), @@ -4241,18 +4241,16 @@ object DarResources { ) val dsoGovernance_0_1_28 = DarResource( "splice-dso-governance-0.1.28.dar", - "030952cacb2cf59a784223f33cbf9761becf7828fe8835a16aee7048f3ca04b6", + "d1ceb0493b95818b6edb8018370b0231ef8a6237bd03e896803130e16dfd3b7f", PackageMetadata( PackageName.assertFromString("splice-dso-governance"), PackageVersion.assertFromString("0.1.28"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", + "84b4b794e9c2f8c9174c1b87deccc4d833af606281a1c3828e1c8e0cd313cf4c", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", - "ccb982381724909db0624c5ab51213f2d064f4eebf57ac4e94f363793c960e37", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", @@ -4270,6 +4268,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -4286,7 +4286,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -4295,6 +4294,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", @@ -4305,18 +4305,16 @@ object DarResources { ) val dsoGovernance_current = DarResource( "splice-dso-governance-current.dar", - "030952cacb2cf59a784223f33cbf9761becf7828fe8835a16aee7048f3ca04b6", + "d1ceb0493b95818b6edb8018370b0231ef8a6237bd03e896803130e16dfd3b7f", PackageMetadata( PackageName.assertFromString("splice-dso-governance"), PackageVersion.assertFromString("0.1.28"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", + "84b4b794e9c2f8c9174c1b87deccc4d833af606281a1c3828e1c8e0cd313cf4c", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", - "ccb982381724909db0624c5ab51213f2d064f4eebf57ac4e94f363793c960e37", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", "4039f60273388c5701e27950ab3e8c3044433b0876535a3b48fb042cc77bf02a", "7cff38e34bd192d498d5a7606aa3b893e35b0f632d582b273f66dab90f2f14ef", @@ -4334,6 +4332,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -4350,7 +4350,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -4359,6 +4358,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", @@ -5720,15 +5720,13 @@ object DarResources { ) val wallet_0_1_23 = DarResource( "splice-wallet-0.1.23.dar", - "db79199ac9d0d1f2c136a71fc1a299ec4d4bf4991d08ee83274fa83a81b28c2a", + "d083cd4738f0ab23d4b8b3cb50fd768ae8734f4fbf6b73d82ca9ddc0f4a86820", PackageMetadata( PackageName.assertFromString("splice-wallet"), PackageVersion.assertFromString("0.1.23"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -5748,6 +5746,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -5764,7 +5764,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -5773,6 +5772,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", @@ -5783,15 +5783,13 @@ object DarResources { ) val wallet_current = DarResource( "splice-wallet-current.dar", - "db79199ac9d0d1f2c136a71fc1a299ec4d4bf4991d08ee83274fa83a81b28c2a", + "d083cd4738f0ab23d4b8b3cb50fd768ae8734f4fbf6b73d82ca9ddc0f4a86820", PackageMetadata( PackageName.assertFromString("splice-wallet"), PackageVersion.assertFromString("0.1.23"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -5811,6 +5809,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -5827,7 +5827,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -5836,6 +5835,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", @@ -6967,15 +6967,13 @@ object DarResources { ) val amuletNameService_0_1_23 = DarResource( "splice-amulet-name-service-0.1.23.dar", - "ccb982381724909db0624c5ab51213f2d064f4eebf57ac4e94f363793c960e37", + "84b4b794e9c2f8c9174c1b87deccc4d833af606281a1c3828e1c8e0cd313cf4c", PackageMetadata( PackageName.assertFromString("splice-amulet-name-service"), PackageVersion.assertFromString("0.1.23"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -6995,6 +6993,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -7011,7 +7011,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -7020,6 +7019,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", @@ -7030,15 +7030,13 @@ object DarResources { ) val amuletNameService_current = DarResource( "splice-amulet-name-service-current.dar", - "ccb982381724909db0624c5ab51213f2d064f4eebf57ac4e94f363793c960e37", + "84b4b794e9c2f8c9174c1b87deccc4d833af606281a1c3828e1c8e0cd313cf4c", PackageMetadata( PackageName.assertFromString("splice-amulet-name-service"), PackageVersion.assertFromString("0.1.23"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -7058,6 +7056,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -7074,7 +7074,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -7083,6 +7082,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", @@ -8143,15 +8143,13 @@ object DarResources { ) val walletPayments_0_1_22 = DarResource( "splice-wallet-payments-0.1.22.dar", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", PackageMetadata( PackageName.assertFromString("splice-wallet-payments"), PackageVersion.assertFromString("0.1.22"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -8171,6 +8169,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -8205,15 +8205,13 @@ object DarResources { ) val walletPayments_current = DarResource( "splice-wallet-payments-current.dar", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", PackageMetadata( PackageName.assertFromString("splice-wallet-payments"), PackageVersion.assertFromString("0.1.22"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -8233,6 +8231,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -9387,15 +9387,13 @@ object DarResources { ) val splitwell_0_1_23 = DarResource( "splitwell-0.1.23.dar", - "996b1df7a618be219c368be4e5a0081ddb4703265bded8e5c7a7973fd6bfe264", + "00bf995ca73217cc62c2de9614bce6b8d3ab7233509a86d851b799f13537bb57", PackageMetadata( PackageName.assertFromString("splitwell"), PackageVersion.assertFromString("0.1.23"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -9415,6 +9413,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -9431,7 +9431,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -9440,6 +9439,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", @@ -9450,15 +9450,13 @@ object DarResources { ) val splitwell_current = DarResource( "splitwell-current.dar", - "996b1df7a618be219c368be4e5a0081ddb4703265bded8e5c7a7973fd6bfe264", + "00bf995ca73217cc62c2de9614bce6b8d3ab7233509a86d851b799f13537bb57", PackageMetadata( PackageName.assertFromString("splitwell"), PackageVersion.assertFromString("0.1.23"), None, ), Set( - "ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926", - "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "7adc4c2d07fa3a51173c843cba36e610c1168b2dbbf53076e20c0092eae8763d", "4ded6b668cb3b64f7a88a30874cd41c75829f5e064b3fbbadf41ec7e8363354f", "29317e3b7b165d2bbf16721bcca0ec4869e53eddb2738bddf790d61af28e0099", @@ -9478,6 +9476,8 @@ object DarResources { "718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b", "5c1097a9bad0af4bcfe6d3fb0fe55112d3d11f18eae57ddfb14c20836fee226c", "52854220dc199884704958df38befd5492d78384a032fd7558c38f00e3d778a2", + "63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2", + "9e70a8b3510d617f8a136213f33d6a903a10ca0eeec76bb06ba55d1ed9680f69", "d095a2ccf6dd36b2415adc4fa676f9191ba63cd39828dc5207b36892ec350cbc", "6fe848530b2404017c4a12874c956ad7d5c8a419ee9b040f96b5c13172d2e193", "b5be6316177384677c024316c0bfaf7d3d494e7c3ad6c540d2032e6112b004bc", @@ -9494,7 +9494,6 @@ object DarResources { "86d888f34152dae8729900966b44abcb466b9c111699678de58032de601d2b04", "6da1f43a10a179524e840e7288b47bda213339b0552d92e87ae811e52f59fc0e", "051a3b0563a6fa4df4cb34448081e48b061e555aa1a265abf6ae8f3f4cafe439", - "2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3", "c280cc3ef501d237efa7b1120ca3ad2d196e089ad596b666bed59a85f3c9a074", "22ffcbab726e64e179deebd895307fad94efbae3f72b07677e24038d0fbf4467", "3cde94fe9be5c700fc1d9a8ad2277e2c1214609f8c52a5b4db77e466875b8cb7", @@ -9503,6 +9502,7 @@ object DarResources { "ee33fb70918e7aaa3d3fc44d64a399fb2bf5bcefc54201b1690ecd448551ba88", "275064aacfe99cea72ee0c80563936129563776f67415ef9f13e4297eecbc520", "9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1", + "6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439", "e5411f3d75f072b944bd88e652112a14a3d409c491fd9a51f5f6eede6d3a3348", "5aee9b21b8e9a4c4975b5f4c4198e6e6e8469df49e2010820e792f393db870f4", "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281", diff --git a/daml/dars.lock b/daml/dars.lock index 5c72103310..1c885c649d 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 ee782542f2affd1e9f47ba563d974360b1e31b59dd13d393a80fc40785968926 +splice-amulet 0.1.22 63ed7364f4d5d021bad56f1bfd162ca26b8aa8d10ce5861fca01347eab3e4bb2 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 ccb982381724909db0624c5ab51213f2d064f4eebf57ac4e94f363793c960e37 +splice-amulet-name-service 0.1.23 84b4b794e9c2f8c9174c1b87deccc4d833af606281a1c3828e1c8e0cd313cf4c 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 6e233807e40b1d0457a14627f5b2e53815cc0aa5c9e9c74d10e7979712864fa9 -splice-amulet-test 0.1.26 c98edece3a89bcda71547e07990d36052ac776da8cf084a705cf75e0b4cf73df +splice-amulet-name-service-test 0.1.27 6c5a24a63e02a887304517a04131e3f5f1a30efe3621d861309da4958218495d +splice-amulet-test 0.1.26 546d87dd6916550488c623498b0506a046f5e755dd97ea6a646392d471e0acfe 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 030952cacb2cf59a784223f33cbf9761becf7828fe8835a16aee7048f3ca04b6 +splice-dso-governance 0.1.28 d1ceb0493b95818b6edb8018370b0231ef8a6237bd03e896803130e16dfd3b7f 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 75422489d4f173e9d1454db11e70de2a3261f150f3f9225aaad1685efecb610c +splice-dso-governance-test 0.1.34 c1f017c15bb39f1f43128c03767579907e74f43b7950a9f6877b8333362c7dcd splice-test-token-v1 1.0.0 aaa0b576b5a3db49b3a4f7a4710fe6f8ae462aabbde4da89f639eb87fd62e90c -splice-test-token-v1-test 1.0.1 992b489465e6f7e8de01251b91fa72e00ae1bea6d86706051fce3b6434dce056 +splice-test-token-v1-test 1.0.1 397e9016f18a08c7b28abc5f26d10e6ed4bfb4593321e21c396992642061e84f splice-test-token-v2 1.0.0 a38a96b6f46c14c599b2763bc4fc68911a9cada90f89c599a1401e8e3df685e1 -splice-test-token-v2-test 1.0.1 3b1bc8d60733c23edfc86f926200089ba81c688a841305919bad6249e5c2ed60 +splice-test-token-v2-test 1.0.1 935e032b45c0b410da4be2934e12b5d5385073349ed13d71aea194b556de06b6 splice-token-standard-utils 2.0.0 9a8f41a2b1456d357dee5677565c21b9a5aa45b80f0ed6be469694445dd4f6e1 -splice-token-standard-utils-test 1.0.1 48bfbb93fbf39bc3e1aae339ff377f663d1e0bb57fcaa99b9dc48e6e21f9e8cd -splice-token-standard-v1-test 1.0.16 5f46b8e8027409c1ace8acdb27dbe3f1cef174a30904e07d21f20753c1226d06 -splice-token-standard-v2-test 1.0.1 476dedd754d7a456b33e54cd7348760ff45c4a48b5aed2960e2e443670971e01 +splice-token-standard-utils-test 1.0.1 44444c114a297a496f4366dbfe079605f638d56fad537851a75db9b26120dd1e +splice-token-standard-v1-test 1.0.16 d57b8bf7cac91622c54f2ad3ea21b6a0343e602624792bf42e86bcac8703bc10 +splice-token-standard-v2-test 1.0.1 6daa72e0a9b5c36d1cae8a5cab8cd7e13513b68e96dc1e8f6aebf8b943c51746 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 bbfb0ebbe6c32819a2b9825ef6bbbe70626399422593933ca6122461a9f500a6 +splice-util-batched-markers-test 1.0.9 ec28cf1de0e8f47463910fb7470b1839e0d9556664a6c09668e021b2bc858464 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 b8921f2f380333cad177594ebb068ceb04e1b025997355b9498f42a2a99da562 +splice-util-featured-app-proxies-test 1.0.15 97db8e545e1e5859a1e502929fed313ce2245838d59f4bc3fdfa940ae2a6ba1e 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 a843cd2439bd34499c67fa9ca559a94d84a6638dd2d6088b34b97982c2de0e35 +splice-util-token-standard-wallet-test 1.0.10 12d26cd57702689a4c99e5fefe59e9ed56aa4f1acaa8c9e88a8666e9b37abbb9 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 db79199ac9d0d1f2c136a71fc1a299ec4d4bf4991d08ee83274fa83a81b28c2a +splice-wallet 0.1.23 d083cd4738f0ab23d4b8b3cb50fd768ae8734f4fbf6b73d82ca9ddc0f4a86820 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 2cb41fb6887df874ee37c0fe0f68ecc147c58b167d9a65bd1d4c1f0ca410c6e3 +splice-wallet-payments 0.1.22 6e012c34266db31377d7bc563d51b79a9c556f25308fe8c5427900f4613e8439 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 3e97273c284d7045483675db72dd60d627f1d4b920e5572c96e576fe56bedaf9 +splice-wallet-test 0.1.27 0b5aba4cc223a4fa0c79445eeaaf4dc1f2a9c6dc73e72edb41b2504787842e8f 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 996b1df7a618be219c368be4e5a0081ddb4703265bded8e5c7a7973fd6bfe264 +splitwell 0.1.23 00bf995ca73217cc62c2de9614bce6b8d3ab7233509a86d851b799f13537bb57 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 684da9b7d98befd82f5508d639360c339df41b38de1fccd84fd4e7494a7e0c74 \ No newline at end of file +splitwell-test 0.1.27 530ef10b29d2ad83e30e8b686995dd31b9f941d87b5804e0641e18723b836133 \ 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 11388c83cd..57c4997a70 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 96bf123131..5c021e5e06 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 c25662642a..dce9492e07 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 11cc7ed5c3..dcf4b2e24b 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 45e2e9bfc0..3fa2f3d410 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 fadb045548..c2c9a1d65f 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/TestExtensionRewardReporting.daml b/daml/splice-amulet-test/daml/Splice/Scripts/TestExtensionRewardReporting.daml new file mode 100644 index 0000000000..77074d2bca --- /dev/null +++ b/daml/splice-amulet-test/daml/Splice/Scripts/TestExtensionRewardReporting.daml @@ -0,0 +1,399 @@ +-- Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- | PoC (extension reward reporting): a registered synchronizer's operator reports its per-round +-- activity on the decentralized synchronizer as a Merkle root-hash commitment plus total, the +-- DSO party starts reward processing with an issuance rate, and the operator expands its +-- committed batches into `RewardCouponV2` contracts (amount = activity weight * rate). +-- +-- The registration vote plumbing is exercised elsewhere; here the registration and the +-- reporting state are created directly as the DSO party and the start-processing choice is +-- exercised directly, to isolate the reporting and expansion mechanics. +module Splice.Scripts.TestExtensionRewardReporting where + +import DA.Assert +import DA.Foldable (forA_) +import qualified DA.Set as Set +import DA.Time + +import Daml.Script + +import Splice.Amulet (RewardCouponV2(..)) +import Splice.Amulet.CryptoHash qualified as CryptoHash +import Splice.Amulet.RewardAccountingV2 +import Splice.AmuletRules +import Splice.DecentralizedSynchronizer +import Splice.Types (Round(..)) + +import Splice.Scripts.Util + +testSyncId : Text +testSyncId = "registered-sync::1220fafafafafafafafafafafafafafafafafafafafafafafafafafafafafafa" + +-- | Everything the tests need after an operator has reported: the app, the parties, the +-- on-ledger report, and the committed tree (root + both leaves). +data ReportedActivitySetup = ReportedActivitySetup with + app : AmuletApp + operator : Party + registrationCid : ContractId RegisteredSynchronizer + featuredA : Party + featuredB : Party + reportCid : ContractId ExtensionActivityReport + root : Batch + leaf1 : Batch + leaf2 : Batch + +-- | Common setup: an operator with a reporting state, two featured providers, and a two-level +-- batch tree over activity weights (10 + 30 for the providers, 10 for the operator's own cut), +-- reported for round 1. +setupReportedActivity : Script ReportedActivitySetup +setupReportedActivity = do + d <- setupDefaultAppWithUsers + let app = d.app + operator <- allocateParty "registeredSyncOperator" + featuredA <- allocateParty "featuredAppA" + featuredB <- allocateParty "featuredAppB" + + registrationCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = testSyncId + operator + stateCid <- submit app.dso $ createCmd DedicatedSynchronizerState with + dso = app.dso + synchronizerId = testSyncId + operator + lastReportedRound = None + totalActivityReported = 0.0 + + -- the operator's committed tree: leaves are activity weights, not Amulet + let leaf1 = BatchOfMintingAllowances + [ MintingAllowance with provider = featuredA; amount = 10.0 + , MintingAllowance with provider = featuredB; amount = 30.0 + ] + leaf2 = BatchOfMintingAllowances + [ MintingAllowance with provider = operator; amount = 10.0 ] + root = BatchOfWeightedBatches + [ WeightedBatchRef with batchHash = CryptoHash.hash leaf1; weight = 40.0 + , WeightedBatchRef with batchHash = CryptoHash.hash leaf2; weight = 10.0 + ] + + result <- submit operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 1 + activityRootHash = CryptoHash.hash root + totalActivity = 50.0 + + -- the report is on-ledger and the running state advanced + Some st <- queryContractId app.dso result.stateCid + st.lastReportedRound === Some (Round 1) + st.totalActivityReported === 50.0 + + pure ReportedActivitySetup with app; operator; registrationCid; featuredA; featuredB; reportCid = result.reportCid; root; leaf1; leaf2 + +-- | Happy path: report -> start processing at a rate -> operator expands root and leaves -> +-- coupons carry weight * rate. +test_ReportAndExpand : Script () +test_ReportAndExpand = do + ReportedActivitySetup{..} <- setupReportedActivity + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + submit app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + + -- the report is consumed; the root ProcessRewardsV2 names the operator as expander + None <- queryContractId app.dso reportCid + [(rootCid, rootState)] <- query @ProcessRewardsV2 operator + rootState.expander === Some operator + rootState.batchHash === CryptoHash.hash root + rootState.issuancePerActivityUnit === Some 2.0 + rootState.round === Round 1 + + -- operator expands the root, then each leaf (matching contracts by committed hash) + submit operator $ exerciseCmd rootCid ProcessRewardsV2_ProcessBatch with + batch = root + providersWithWrongVettingState = Set.empty + children <- query @ProcessRewardsV2 operator + length children === 2 + forA_ children $ \(cid, st) -> do + let batch = if st.batchHash == CryptoHash.hash leaf1 then leaf1 else leaf2 + CryptoHash.hash batch === st.batchHash + submit operator $ exerciseCmd cid ProcessRewardsV2_ProcessBatch with + batch + providersWithWrongVettingState = Set.empty + [] <- query @ProcessRewardsV2 operator + + -- coupons mint at weight * rate + couponsA <- query @RewardCouponV2 featuredA + map (\(_, c) -> (c.provider, c.amount, c.round)) couponsA === [(featuredA, 20.0, Round 1)] + couponsB <- query @RewardCouponV2 featuredB + map (\(_, c) -> c.amount) couponsB === [60.0] + couponsOp <- query @RewardCouponV2 operator + map (\(_, c) -> c.amount) couponsOp === [20.0] + +-- | Reports must use strictly increasing rounds; totals accumulate across reports. +test_Report_monotonicRounds : Script () +test_Report_monotonicRounds = do + ReportedActivitySetup{app, operator} <- setupReportedActivity + [(stateCid, _)] <- query @DedicatedSynchronizerState operator + + -- same round again: rejected + submitMustFail operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 1 + activityRootHash = CryptoHash.hash (BatchOfMintingAllowances []) + totalActivity = 1.0 + -- earlier round: rejected + submitMustFail operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 0 + activityRootHash = CryptoHash.hash (BatchOfMintingAllowances []) + totalActivity = 1.0 + -- negative total: rejected + submitMustFail operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 2 + activityRootHash = CryptoHash.hash (BatchOfMintingAllowances []) + totalActivity = -1.0 + -- next round: accepted, running total accumulates + result <- submit operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 2 + activityRootHash = CryptoHash.hash (BatchOfMintingAllowances []) + totalActivity = 7.0 + Some st <- queryContractId app.dso result.stateCid + st.lastReportedRound === Some (Round 2) + st.totalActivityReported === 57.0 + -- only the operator can report + submitMustFail app.dso $ exerciseCmd result.stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 3 + activityRootHash = CryptoHash.hash (BatchOfMintingAllowances []) + totalActivity = 1.0 + +-- | Expansion is bound to the commitment: a tampered batch fails the hash check, and only the +-- expander can process extension batches (the DSO party cannot). +test_Expand_hashAndAuthorization : Script () +test_Expand_hashAndAuthorization = do + ReportedActivitySetup{app, operator, registrationCid, featuredA, reportCid, root, leaf1} <- setupReportedActivity + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + -- a non-positive rate is rejected up front + submitMustFail app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 0.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + -- reported activity above the vote-attested purchased total is rejected + submitMustFail app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 49 + rewardCouponTimeToLive = days 30 + dryRun = False + + submit app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + [(rootCid, _)] <- query @ProcessRewardsV2 operator + + -- tampered pre-image: an inflated leaf in place of the committed root fails the hash check + let tampered = BatchOfMintingAllowances [MintingAllowance with provider = featuredA; amount = 1000000.0] + submitMustFail operator $ exerciseCmd rootCid ProcessRewardsV2_ProcessBatch with + batch = tampered + providersWithWrongVettingState = Set.empty + -- correct pre-image but wrong controller: the DSO party is not the expander + submitMustFail app.dso $ exerciseCmd rootCid ProcessRewardsV2_ProcessBatch with + batch = root + providersWithWrongVettingState = Set.empty + -- the committed pre-image from the expander works + submit operator $ exerciseCmd rootCid ProcessRewardsV2_ProcessBatch with + batch = root + providersWithWrongVettingState = Set.empty + -- a leaf batch cannot be replayed against the other leaf's hash + children <- query @ProcessRewardsV2 operator + let Some (wrongCid, _) = find (\(_, st) -> st.batchHash /= CryptoHash.hash leaf1) children + submitMustFail operator $ exerciseCmd wrongCid ProcessRewardsV2_ProcessBatch with + batch = leaf1 + providersWithWrongVettingState = Set.empty + +-- | Dry run: the whole expansion executes and consumes its contracts without minting coupons. +test_Expand_dryRun : Script () +test_Expand_dryRun = do + ReportedActivitySetup{..} <- setupReportedActivity + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + submit app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = True + [(rootCid, _)] <- query @ProcessRewardsV2 operator + submit operator $ exerciseCmd rootCid ProcessRewardsV2_ProcessBatch with + batch = root + providersWithWrongVettingState = Set.empty + children <- query @ProcessRewardsV2 operator + forA_ children $ \(cid, st) -> do + let batch = if st.batchHash == CryptoHash.hash leaf1 then leaf1 else leaf2 + submit operator $ exerciseCmd cid ProcessRewardsV2_ProcessBatch with + batch + providersWithWrongVettingState = Set.empty + [] <- query @ProcessRewardsV2 operator + coupons <- query @RewardCouponV2 featuredA + coupons === [] + +-- | The committed tree cannot mint beyond the reported total: over-declared internal nodes and +-- over-weight leaves are both rejected against the threaded budget. +test_Expand_budgetEnforced : Script () +test_Expand_budgetEnforced = do + d <- setupDefaultAppWithUsers + let app = d.app + operator <- allocateParty "registeredSyncOperator" + featured <- allocateParty "featuredOverclaimer" + registrationCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = testSyncId + operator + stateCid <- submit app.dso $ createCmd DedicatedSynchronizerState with + dso = app.dso + synchronizerId = testSyncId + operator + lastReportedRound = None + totalActivityReported = 0.0 + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + + -- an internal node declaring more weight than the reported total cannot expand + let fatLeaf = BatchOfMintingAllowances [MintingAllowance with provider = featured; amount = 500.0] + overRoot = BatchOfWeightedBatches + [ WeightedBatchRef with batchHash = CryptoHash.hash fatLeaf; weight = 500.0 ] + r1 <- submit operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 1 + activityRootHash = CryptoHash.hash overRoot + totalActivity = 50.0 + submit app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid = r1.reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + [(overRootCid, _)] <- query @ProcessRewardsV2 operator + submitMustFail operator $ exerciseCmd overRootCid ProcessRewardsV2_ProcessBatch with + batch = overRoot + providersWithWrongVettingState = Set.empty + + -- a leaf claiming more than the weight its parent declared for it cannot expand + [(stateCid2, _)] <- query @DedicatedSynchronizerState operator + let lyingLeaf = BatchOfMintingAllowances [MintingAllowance with provider = featured; amount = 45.0] + root2 = BatchOfWeightedBatches + [ WeightedBatchRef with batchHash = CryptoHash.hash lyingLeaf; weight = 40.0 ] + r2 <- submit operator $ exerciseCmd stateCid2 DedicatedSynchronizerState_ReportActivity with + round = Round 2 + activityRootHash = CryptoHash.hash root2 + totalActivity = 50.0 + submit app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid = r2.reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + prs <- query @ProcessRewardsV2 operator + let Some (root2Cid, _) = find (\(_, st) -> st.batchHash == CryptoHash.hash root2) prs + submit operator $ exerciseCmd root2Cid ProcessRewardsV2_ProcessBatch with + batch = root2 + providersWithWrongVettingState = Set.empty + prs2 <- query @ProcessRewardsV2 operator + let Some (leafCid, _) = find (\(_, st) -> st.batchHash == CryptoHash.hash lyingLeaf) prs2 + submitMustFail operator $ exerciseCmd leafCid ProcessRewardsV2_ProcessBatch with + batch = lyingLeaf + providersWithWrongVettingState = Set.empty + +-- | Path exclusivity: unweighted internal nodes are for the decentralized synchronizer only, +-- so an extension tree cannot smuggle weight past the budget through a plain BatchOfBatches. +test_Expand_pathExclusivity : Script () +test_Expand_pathExclusivity = do + d <- setupDefaultAppWithUsers + let app = d.app + operator <- allocateParty "registeredSyncOperator" + featured <- allocateParty "featuredAppX" + registrationCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = testSyncId + operator + stateCid <- submit app.dso $ createCmd DedicatedSynchronizerState with + dso = app.dso + synchronizerId = testSyncId + operator + lastReportedRound = None + totalActivityReported = 0.0 + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + let leaf = BatchOfMintingAllowances [MintingAllowance with provider = featured; amount = 10.0] + plainRoot = BatchOfBatches [CryptoHash.hash leaf] + r <- submit operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 1 + activityRootHash = CryptoHash.hash plainRoot + totalActivity = 10.0 + submit app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid = r.reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + [(rootCid, _)] <- query @ProcessRewardsV2 operator + submitMustFail operator $ exerciseCmd rootCid ProcessRewardsV2_ProcessBatch with + batch = plainRoot + providersWithWrongVettingState = Set.empty + +-- | Start-processing is gated on the live registration: the report must match the +-- registration's synchronizer id AND operator, and an archived (offboarded) registration +-- closes the reward path entirely - leftover reports can never be processed. +test_StartProcessing_registrationGate : Script () +test_StartProcessing_registrationGate = do + ReportedActivitySetup{app, operator, registrationCid, reportCid} <- setupReportedActivity + (amuletRulesCid, _) <- fetchAmuletRulesByKey app.dso + otherOperator <- allocateParty "otherOperator" + + -- duplicate-registration recovery case: same synchronizer id under another operator + -- does not authorize processing this operator's report + dupRegCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = testSyncId + operator = otherOperator + submitMustFail app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = dupRegCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + + -- a registration for a different synchronizer does not authorize it either + otherRegCid <- submit app.dso $ createCmd RegisteredSynchronizer with + dso = app.dso + synchronizerId = "registered-sync::1220abababababababababababababababababababababababababababababab" + operator + submitMustFail app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = otherRegCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + + -- offboarded: with the registration archived, the pending report can never be processed + submit app.dso $ archiveCmd registrationCid + submitMustFail app.dso $ exerciseCmd amuletRulesCid AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid + registeredSynchronizerCid = registrationCid + issuancePerActivityUnit = 2.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False diff --git a/daml/splice-amulet/daml/Splice/Amulet/RewardAccountingV2.daml b/daml/splice-amulet/daml/Splice/Amulet/RewardAccountingV2.daml index 00448eb0e3..4df7085c38 100644 --- a/daml/splice-amulet/daml/Splice/Amulet/RewardAccountingV2.daml +++ b/daml/splice-amulet/daml/Splice/Amulet/RewardAccountingV2.daml @@ -14,6 +14,7 @@ module Splice.Amulet.RewardAccountingV2 where import DA.Action (unless) import DA.Foldable (forA_) +import DA.Optional (fromOptional, isNone, isSome, optionalToList) import DA.Set as Set import DA.Time @@ -49,9 +50,21 @@ data MintingAllowance = MintingAllowance with type MintingAllowances = [MintingAllowance] +-- | A child batch reference inside a weighted internal node: the child's hash together with +-- the total activity weight its subtree may mint. The weight is part of the hashed commitment, +-- so it is fixed when the root is reported. +data WeightedBatchRef = WeightedBatchRef with + batchHash : CryptoHash.Hash + weight : Decimal + deriving (Eq, Show) + data Batch = BatchOfBatches [CryptoHash.Hash] | BatchOfMintingAllowances MintingAllowances + | BatchOfWeightedBatches [WeightedBatchRef] + -- ^ Internal node for a registered synchronizer's rewards: expansion checks the declared + -- child weights against this contract's budget and endows each child with its declared + -- weight, bounding the whole tree's minting by the reported total. deriving (Eq, Show) data ProcessRewardsV2_ProcessBatchResult = ProcessRewardsV2_ProcessBatchResult {} @@ -64,13 +77,30 @@ template ProcessRewardsV2 with roundClosedAt : Time -- ^ The time at which the round was closed. -- - -- Copied from the originating CalculateRewardsV2 contract. + -- Copied from the originating CalculateRewardsV2 contract; for a registered synchronizer's + -- rewards it is the time processing was started, as the reports carry no round-close time. -- We store this for ease of doing debugging and gathering metrics. dryRun : Bool -- ^ Whether to only simulate the processing without creating any RewardCouponV2 contracts. rewardCouponTimeToLive : RelTime batchHash : CryptoHash.Hash + expander : Optional Party + -- ^ For a registered synchronizer's rewards (PoC, extension reward reporting): the + -- synchronizer's operator, the only party holding the committed batch data and thus the + -- one that processes the batches. `None` for the decentralized synchronizer's own rewards, + -- which the DSO party processes as before. + issuancePerActivityUnit : Optional Decimal + -- ^ For a registered synchronizer's rewards: the issuance rate computed by DSO automation. When set, the + -- committed batch amounts are activity weights and each coupon mints weight * rate; `None` + -- means the amounts are Amulet directly, as for the decentralized synchronizer. + weightBudget : Optional Decimal + -- ^ For a registered synchronizer's rewards: the activity weight this contract's subtree + -- may mint, threaded down from the reported round total. Together with the per-level + -- checks in `ProcessRewardsV2_ProcessBatch` this bounds the total minted by the reported + -- (and vote-checked) activity. `None` for the decentralized synchronizer's own rewards. where signatory dso + -- the expander holds the committed batch data off-ledger and must see these contracts to act + observer (optionalToList expander) choice ProcessRewardsV2_ProcessBatch : ProcessRewardsV2_ProcessBatchResult with @@ -78,12 +108,14 @@ template ProcessRewardsV2 with providersWithWrongVettingState : Set Party -- ^ Service providers that do not have the correct vetting state for receiving rewards. observer batchProviders providersWithWrongVettingState batch - controller dso + controller fromOptional dso expander do let actualHash = CryptoHash.hash batch require "batch hash matches" (actualHash == batchHash) case batch of BatchOfBatches batchHashes -> do + require "unweighted internal nodes are only for decentralized-synchronizer rewards" + (isNone issuancePerActivityUnit) forA_ batchHashes $ \newBatchHash -> create ProcessRewardsV2 with dso @@ -92,7 +124,37 @@ template ProcessRewardsV2 with rewardCouponTimeToLive dryRun batchHash = newBatchHash + expander + issuancePerActivityUnit + weightBudget + BatchOfWeightedBatches weightedRefs -> do + require "weighted internal nodes are only for registered-synchronizer rewards" + (isSome issuancePerActivityUnit) + budget <- case weightBudget of + Some b -> pure b + None -> abort "weighted batch without a weight budget" + require "declared child weights are positive" + (all (\ref -> ref.weight > 0.0) weightedRefs) + require "declared child weights are within this subtree's budget" + (sum (map (\ref -> ref.weight) weightedRefs) <= budget) + forA_ weightedRefs $ \ref -> + create ProcessRewardsV2 with + dso + round + roundClosedAt + rewardCouponTimeToLive + dryRun + batchHash = ref.batchHash + expander + issuancePerActivityUnit + weightBudget = Some ref.weight BatchOfMintingAllowances mintingAllowances -> do + forA_ issuancePerActivityUnit $ \_ -> do + budget <- case weightBudget of + Some b -> pure b + None -> abort "weighted leaf without a weight budget" + require "allowance weights are within this subtree's budget" + (sum [ ma.amount | ma <- mintingAllowances ] <= budget) unless dryRun $ do -- Coupon expiry is determined here based on the time of creation to ensure -- providers are always given the full rewardCouponTimeToLive duration to redeem their coupons, @@ -104,7 +166,8 @@ template ProcessRewardsV2 with dso round provider - amount + -- committed amounts are activity weights when an issuance rate is set + amount = optional amount (amount *) issuancePerActivityUnit expiresAt providerIsObserver = not $ Set.member provider providersWithWrongVettingState @@ -116,6 +179,7 @@ template ProcessRewardsV2 with batchProviders : Set Party -> Batch -> [Party] batchProviders ignoredProviders batch = case batch of BatchOfBatches _ -> [] + BatchOfWeightedBatches _ -> [] BatchOfMintingAllowances mintingAllowances -> [ provider | MintingAllowance{..} <- mintingAllowances, not (Set.member provider ignoredProviders) ] @@ -126,12 +190,18 @@ instance CryptoHash.Hashable MintingAllowance where hash MintingAllowance {provider, amount} = CryptoHash.hashRecord [CryptoHash.hash provider , CryptoHash.hash amount] +instance CryptoHash.Hashable WeightedBatchRef where + hash WeightedBatchRef {batchHash, weight} = + CryptoHash.hashRecord [CryptoHash.hash batchHash, CryptoHash.hash weight] + instance CryptoHash.Hashable Batch where hash batch = case batch of BatchOfBatches batchHashes -> CryptoHash.hashVariant "BatchOfBatches" [CryptoHash.hash batchHashes] BatchOfMintingAllowances mintingAllowances -> CryptoHash.hashVariant "BatchOfMintingAllowances" [CryptoHash.hash mintingAllowances] + BatchOfWeightedBatches weightedRefs -> + CryptoHash.hashVariant "BatchOfWeightedBatches" [CryptoHash.hash weightedRefs] instance HasCheckedFetch CalculateRewardsV2 ForDso where contractGroupId CalculateRewardsV2 with .. = ForDso with .. diff --git a/daml/splice-amulet/daml/Splice/AmuletRules.daml b/daml/splice-amulet/daml/Splice/AmuletRules.daml index 3fc6725a9d..a1814ed1ae 100644 --- a/daml/splice-amulet/daml/Splice/AmuletRules.daml +++ b/daml/splice-amulet/daml/Splice/AmuletRules.daml @@ -109,6 +109,8 @@ data AmuletRules_ClaimExpiredRewardsV2Result = AmuletRules_ClaimExpiredRewardsV2 data AmuletRules_StartProcessingRewardsV2Result = AmuletRules_StartProcessingRewardsV2Result {} +data AmuletRules_StartProcessingExtensionRewardsV2Result = AmuletRules_StartProcessingExtensionRewardsV2Result {} + data AmuletRules_UnhideRewardCouponsV2Result = AmuletRules_UnhideRewardCouponsV2Result {} data AmuletRules_ArchiveDryRunRewardAccountingV2Result = AmuletRules_ArchiveDryRunRewardAccountingV2Result {} @@ -750,9 +752,56 @@ template AmuletRules dryRun = calculateRewards.dryRun rewardCouponTimeToLive = calculateRewards.rewardCouponTimeToLive batchHash + expander = None + issuancePerActivityUnit = None + weightBudget = None return AmuletRules_StartProcessingRewardsV2Result {} + nonconsuming choice AmuletRules_StartProcessingExtensionRewardsV2 : AmuletRules_StartProcessingExtensionRewardsV2Result + -- ^ PoC (extension reward reporting): start reward processing for a registered synchronizer's + -- reported activity. Consumes the operator's report and creates the root ProcessRewardsV2 + -- with the operator as expander and the issuance rate computed by DSO automation; the + -- operator then expands its committed batches into RewardCouponV2 contracts. The rate + -- computation (app-reward tranche split by burn share, the voted per-synchronizer weight, + -- and the reported-vs-purchased cap) happens off-ledger in the SV apps before this action + -- is confirmed. + with + reportCid : ContractId ExtensionActivityReport + registeredSynchronizerCid : ContractId RegisteredSynchronizer + -- ^ the live registration the report was filed under; processing requires it to match + -- the report's synchronizer id and operator, so offboarding (archiving the + -- registration) closes the reward path the same way it closes the buy path + issuancePerActivityUnit : Decimal -- ^ Amulet minted per unit of reported activity weight + purchasedTotal : Int + -- ^ total traffic purchased for the synchronizer (bytes), computed off-ledger + -- by DSO automation and attested by the confirming vote; bounds the reported activity + rewardCouponTimeToLive : RelTime + dryRun : Bool + controller dso + do + require "issuance rate is positive" (issuancePerActivityUnit > 0.0) + report <- fetchAndArchive (ForDso with dso) reportCid + registration <- fetchChecked (ForDso with dso) registeredSynchronizerCid + require "report is for the registered synchronizer and its operator" + (registration.synchronizerId == report.synchronizerId + && registration.operator == report.operator) + require "reported activity does not exceed purchased traffic" + (report.totalActivity <= intToDecimal purchasedTotal) + now <- getTime + create ProcessRewardsV2 with + dso + round = report.round + roundClosedAt = now + dryRun + rewardCouponTimeToLive + batchHash = report.activityRootHash + expander = Some report.operator + issuancePerActivityUnit = Some issuancePerActivityUnit + weightBudget = Some report.totalActivity + + return AmuletRules_StartProcessingExtensionRewardsV2Result {} + -- batch conversion of coupons not yet observable by their providers nonconsuming choice AmuletRules_UnhideRewardCouponsV2 : AmuletRules_UnhideRewardCouponsV2Result with diff --git a/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml b/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml index ff9c310211..8af4f7b489 100644 --- a/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml +++ b/daml/splice-amulet/daml/Splice/DecentralizedSynchronizer.daml @@ -9,6 +9,7 @@ import qualified DA.Set as Set import DA.Text as T import DA.Time +import Splice.Amulet.CryptoHash qualified as CryptoHash import Splice.Types import Splice.Util @@ -157,6 +158,78 @@ template RegisteredSynchronizer with instance HasCheckedFetch RegisteredSynchronizer ForDso where contractGroupId RegisteredSynchronizer{..} = ForDso with .. +data DedicatedSynchronizerState_ReportActivityResult = DedicatedSynchronizerState_ReportActivityResult with + reportCid : ContractId ExtensionActivityReport + stateCid : ContractId DedicatedSynchronizerState + deriving (Show, Eq) + +-- PoC (extension reward reporting): per-synchronizer reporting state, created at registration. +-- The operator reports its synchronizer's activity per round as a commitment: a Merkle root hash +-- over its activity records plus the round total. The records themselves stay with the operator; +-- the root binds the later expansion (see `ProcessRewardsV2`) to what was committed here, and the +-- running total supports the reported-vs-purchased comparison done by the SV apps off-ledger. +template DedicatedSynchronizerState with + dso : Party + -- ^ signatory; reports are visible to all SV nodes via the DSO party + synchronizerId : Text + -- ^ the registered synchronizer this state tracks (see `RegisteredSynchronizer`) + operator : Party + -- ^ the synchronizer's registered operator; sole reporter + lastReportedRound : Optional Round + -- ^ the most recently reported round; reports must use strictly increasing rounds + totalActivityReported : Decimal + -- ^ running total of all activity ever reported for this synchronizer + where + signatory dso + observer operator + + ensure totalActivityReported >= 0.0 + && not (T.isEmpty synchronizerId) + + choice DedicatedSynchronizerState_ReportActivity : DedicatedSynchronizerState_ReportActivityResult + with + round : Round + activityRootHash : CryptoHash.Hash + -- ^ Merkle root over the round's activity records (weights per provider), computed and + -- stored by the operator; expansion must match it batch by batch + totalActivity : Decimal + -- ^ total activity weight in the round, the on-ledger summary of the committed records + controller operator + do + require "totalActivity is non-negative" (totalActivity >= 0.0) + require "round is later than the last reported round" + (optional True (< round) lastReportedRound) + reportCid <- create ExtensionActivityReport with + dso; synchronizerId; operator; round; activityRootHash; totalActivity + stateCid <- create this with + lastReportedRound = Some round + totalActivityReported = totalActivityReported + totalActivity + pure DedicatedSynchronizerState_ReportActivityResult with .. + +-- PoC (extension reward reporting): one report per (synchronizer, round), created by +-- `DedicatedSynchronizerState_ReportActivity` and consumed when DSO governance starts reward +-- processing for it (`AmuletRules_StartProcessingExtensionRewardsV2`). +template ExtensionActivityReport with + dso : Party + synchronizerId : Text + operator : Party + -- ^ the reporting operator; becomes the expander of the resulting `ProcessRewardsV2` + round : Round + activityRootHash : CryptoHash.Hash + totalActivity : Decimal + where + signatory dso + observer operator + + ensure totalActivity >= 0.0 + && not (T.isEmpty synchronizerId) + +instance HasCheckedFetch DedicatedSynchronizerState ForDso where + contractGroupId DedicatedSynchronizerState{..} = ForDso with .. + +instance HasCheckedFetch ExtensionActivityReport ForDso where + contractGroupId ExtensionActivityReport{..} = ForDso with .. + instance Patchable BaseRateTrafficLimits where patch new base current = BaseRateTrafficLimits with burstAmount = patch new.burstAmount base.burstAmount current.burstAmount diff --git a/daml/splice-dso-governance-test/daml/Splice/Scripts/TestExtensionRewardVote.daml b/daml/splice-dso-governance-test/daml/Splice/Scripts/TestExtensionRewardVote.daml new file mode 100644 index 0000000000..e941b20ca4 --- /dev/null +++ b/daml/splice-dso-governance-test/daml/Splice/Scripts/TestExtensionRewardVote.daml @@ -0,0 +1,80 @@ +-- Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- | PoC (extension reward reporting): the full governance path for a registered synchronizer's +-- reported activity — register via vote, report as the operator, start reward processing via a +-- supermajority vote (`CRARC_StartProcessingExtensionRewardsV2`), and expand as the operator. +-- +-- The reporting and expansion mechanics themselves (monotonicity, hash binding, authorization) +-- are exercised in the splice-amulet test package; this test proves the vote dispatch. +module Splice.Scripts.TestExtensionRewardVote where + +import DA.Assert +import qualified DA.Set as Set +import DA.Time + +import Daml.Script + +import Splice.Amulet (RewardCouponV2(..)) +import Splice.Amulet.CryptoHash qualified as CryptoHash +import Splice.Amulet.RewardAccountingV2 +import Splice.AmuletRules +import Splice.DecentralizedSynchronizer +import Splice.DsoRules +import Splice.Types (Round(..)) + +import Splice.Scripts.DsoTestUtils + +test_ExtensionRewards_viaVote : Script () +test_ExtensionRewards_viaVote = do + (app, dso, (sv1, sv2, sv3, sv4)) <- initMainNet + + operator <- allocateParty "dedicatedSyncOperator" + featured <- allocateParty "featuredAppOnExtension" + let dedicatedSyncId = "dedicated-sync::1220fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe" + + -- Rung 1: register the synchronizer via vote. + initiateAndAcceptVote app [sv1, sv2, sv3, sv4] $ + ARC_DsoRules with + dsoAction = SRARC_RegisterSynchronizer DsoRules_RegisterSynchronizer with + synchronizerId = dedicatedSyncId + operator + + -- The vote-created registration authorizes reward processing below. + [(regCid, _)] <- query @RegisteredSynchronizer operator + + -- Reporting state (created directly as the DSO party in this PoC; production wiring of the + -- state creation is part of the registration follow-ups). + stateCid <- submit dso $ createCmd DedicatedSynchronizerState with + dso + synchronizerId = dedicatedSyncId + operator + lastReportedRound = None + totalActivityReported = 0.0 + + -- The operator reports a single-leaf tree of activity weights for round 1. + let leaf = BatchOfMintingAllowances [MintingAllowance with provider = featured; amount = 25.0] + result <- submit operator $ exerciseCmd stateCid DedicatedSynchronizerState_ReportActivity with + round = Round 1 + activityRootHash = CryptoHash.hash leaf + totalActivity = 25.0 + + -- Supermajority vote to start reward processing for the report at a rate of 4 Amulet per unit. + initiateAndAcceptVote app [sv1, sv2, sv3, sv4] $ + ARC_AmuletRules with + amuletRulesAction = CRARC_StartProcessingExtensionRewardsV2 AmuletRules_StartProcessingExtensionRewardsV2 with + reportCid = result.reportCid + registeredSynchronizerCid = regCid + issuancePerActivityUnit = 4.0 + purchasedTotal = 1_000_000 + rewardCouponTimeToLive = days 30 + dryRun = False + + -- The operator expands its committed batch; the featured app's coupon carries weight * rate. + [(prCid, pr)] <- query @ProcessRewardsV2 operator + pr.expander === Some operator + submit operator $ exerciseCmd prCid ProcessRewardsV2_ProcessBatch with + batch = leaf + providersWithWrongVettingState = Set.empty + coupons <- query @RewardCouponV2 featured + map (\(_, c) -> (c.provider, c.amount, c.round)) coupons === [(featured, 100.0, Round 1)] diff --git a/daml/splice-dso-governance/daml/Splice/DsoRules.daml b/daml/splice-dso-governance/daml/Splice/DsoRules.daml index c003cf5c5a..7856cfde8c 100644 --- a/daml/splice-dso-governance/daml/Splice/DsoRules.daml +++ b/daml/splice-dso-governance/daml/Splice/DsoRules.daml @@ -96,6 +96,10 @@ data AmuletRules_ActionRequiringConfirmation -- ^ Voted action to change the `AmuletConfig`. Not idempotent. | CRARC_StartProcessingRewardsV2 AmuletRules_StartProcessingRewardsV2 -- ^ Automated action to start the processing of rewards where the minting allowances were computed off-ledger. + | CRARC_StartProcessingExtensionRewardsV2 AmuletRules_StartProcessingExtensionRewardsV2 + -- ^ PoC (extension reward reporting): voted action to start reward processing for a registered + -- synchronizer's reported activity, consuming the operator's report and creating the + -- ProcessRewardsV2 the operator expands. deriving (Eq, Show) data DsoRules_ActionRequiringConfirmation @@ -1827,6 +1831,7 @@ executeActionRequiringConfirmation dso dsoRulesCid amuletRulesCid act = case act CRARC_RemoveFutureAmuletConfigSchedule choiceArg -> void $ exercise amuletRulesCid choiceArg CRARC_UpdateFutureAmuletConfigSchedule choiceArg -> void $ exercise amuletRulesCid choiceArg CRARC_StartProcessingRewardsV2 choiceArg -> void $ exercise amuletRulesCid choiceArg + CRARC_StartProcessingExtensionRewardsV2 choiceArg -> void $ exercise amuletRulesCid choiceArg ARC_DsoRules with .. -> do void $ fetchChecked (ForDso with dso) dsoRulesCid case dsoAction of @@ -1898,6 +1903,7 @@ actionRequiringConfirmationEffectiveAt action = CRARC_MiningRound_Archive _ -> None CRARC_MiningRound_StartIssuing _ -> None CRARC_StartProcessingRewardsV2 _ -> None + CRARC_StartProcessingExtensionRewardsV2 _ -> None ARC_DsoRules with .. -> None ARC_AnsEntryContext with .. -> None ExtActionRequiringConformation _dummyUnitField ->