diff --git a/Cargo.lock b/Cargo.lock index 49ad9cbc1..4e288405a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,7 +11,7 @@ checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" [[package]] name = "abstract-domain-derive" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "proc-macro2", "quote", @@ -794,7 +794,7 @@ checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "aptos-abstract-gas-usage" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-gas-algebra", @@ -807,7 +807,7 @@ dependencies = [ [[package]] name = "aptos-accumulator" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-crypto", @@ -817,7 +817,7 @@ dependencies = [ [[package]] name = "aptos-aggregator" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-logger", "aptos-types", @@ -831,7 +831,7 @@ dependencies = [ [[package]] name = "aptos-api" version = "0.2.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-api-types", @@ -873,7 +873,7 @@ dependencies = [ [[package]] name = "aptos-api-types" version = "0.0.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-config", @@ -903,7 +903,7 @@ dependencies = [ [[package]] name = "aptos-bcs-utils" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "hex", @@ -912,7 +912,7 @@ dependencies = [ [[package]] name = "aptos-bitvec" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "serde", "serde_bytes", @@ -921,7 +921,7 @@ dependencies = [ [[package]] name = "aptos-block-executor" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-aggregator", @@ -956,7 +956,7 @@ dependencies = [ [[package]] name = "aptos-block-partitioner" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-crypto", "aptos-logger", @@ -977,7 +977,7 @@ dependencies = [ [[package]] name = "aptos-bounded-executor" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "futures", "rustversion", @@ -987,7 +987,7 @@ dependencies = [ [[package]] name = "aptos-build-info" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "shadow-rs", ] @@ -995,7 +995,7 @@ dependencies = [ [[package]] name = "aptos-cached-packages" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-framework", @@ -1009,7 +1009,7 @@ dependencies = [ [[package]] name = "aptos-channels" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-infallible", @@ -1020,7 +1020,7 @@ dependencies = [ [[package]] name = "aptos-compression" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-logger", "aptos-metrics-core", @@ -1032,7 +1032,7 @@ dependencies = [ [[package]] name = "aptos-config" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-crypto", @@ -1063,7 +1063,7 @@ dependencies = [ [[package]] name = "aptos-consensus-types" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-bitvec", @@ -1090,7 +1090,7 @@ dependencies = [ [[package]] name = "aptos-crypto" version = "0.0.3" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aes-gcm", "anyhow", @@ -1143,7 +1143,7 @@ dependencies = [ [[package]] name = "aptos-crypto-derive" version = "0.0.3" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "proc-macro2", "quote", @@ -1153,7 +1153,7 @@ dependencies = [ [[package]] name = "aptos-db" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-accumulator", @@ -1201,7 +1201,7 @@ dependencies = [ [[package]] name = "aptos-db-indexer" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-config", @@ -1221,7 +1221,7 @@ dependencies = [ [[package]] name = "aptos-db-indexer-schemas" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-schemadb", @@ -1235,7 +1235,7 @@ dependencies = [ [[package]] name = "aptos-dkg" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-crypto", @@ -1266,7 +1266,7 @@ dependencies = [ [[package]] name = "aptos-drop-helper" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-infallible", "aptos-metrics-core", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "aptos-event-notifications" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-channels", @@ -1293,7 +1293,7 @@ dependencies = [ [[package]] name = "aptos-executor" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-consensus-types", @@ -1325,7 +1325,7 @@ dependencies = [ [[package]] name = "aptos-executor-service" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-block-partitioner", "aptos-config", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "aptos-executor-test-helpers" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-cached-packages", @@ -1377,7 +1377,7 @@ dependencies = [ [[package]] name = "aptos-executor-types" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-crypto", @@ -1397,7 +1397,7 @@ dependencies = [ [[package]] name = "aptos-experimental-runtimes" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-runtimes", "core_affinity", @@ -1410,7 +1410,7 @@ dependencies = [ [[package]] name = "aptos-faucet-core" version = "2.0.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-config", @@ -1444,7 +1444,7 @@ dependencies = [ [[package]] name = "aptos-faucet-metrics-server" version = "2.0.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-logger", @@ -1458,7 +1458,7 @@ dependencies = [ [[package]] name = "aptos-framework" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-aggregator", @@ -1526,7 +1526,7 @@ dependencies = [ [[package]] name = "aptos-gas-algebra" version = "0.0.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "either", "move-core-types", @@ -1535,7 +1535,7 @@ dependencies = [ [[package]] name = "aptos-gas-meter" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-gas-algebra", "aptos-gas-schedule", @@ -1550,7 +1550,7 @@ dependencies = [ [[package]] name = "aptos-gas-profiling" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-gas-algebra", @@ -1570,7 +1570,7 @@ dependencies = [ [[package]] name = "aptos-gas-schedule" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-gas-algebra", "aptos-global-constants", @@ -1583,17 +1583,17 @@ dependencies = [ [[package]] name = "aptos-global-constants" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" [[package]] name = "aptos-id-generator" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" [[package]] name = "aptos-indexer" version = "0.0.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-api", @@ -1625,7 +1625,7 @@ dependencies = [ [[package]] name = "aptos-indexer-grpc-fullnode" version = "1.0.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-api", @@ -1637,7 +1637,7 @@ dependencies = [ "aptos-mempool", "aptos-metrics-core", "aptos-moving-average 0.1.0 (git+https://github.com/movementlabsxyz/aptos-indexer-processors)", - "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd)", + "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e)", "aptos-runtimes", "aptos-storage-interface", "aptos-types", @@ -1663,7 +1663,7 @@ dependencies = [ [[package]] name = "aptos-indexer-grpc-table-info" version = "1.0.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-api", @@ -1694,11 +1694,11 @@ dependencies = [ [[package]] name = "aptos-indexer-grpc-utils" version = "1.0.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-metrics-core", - "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd)", + "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e)", "async-trait", "backoff", "base64 0.13.1", @@ -1726,12 +1726,12 @@ dependencies = [ [[package]] name = "aptos-infallible" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" [[package]] name = "aptos-jellyfish-merkle" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-crypto", @@ -1759,7 +1759,7 @@ dependencies = [ [[package]] name = "aptos-keygen" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-crypto", "aptos-types", @@ -1769,7 +1769,7 @@ dependencies = [ [[package]] name = "aptos-language-e2e-tests" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-abstract-gas-usage", @@ -1813,7 +1813,7 @@ dependencies = [ [[package]] name = "aptos-ledger" version = "0.2.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-crypto", "aptos-types", @@ -1826,7 +1826,7 @@ dependencies = [ [[package]] name = "aptos-log-derive" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "proc-macro2", "quote", @@ -1836,7 +1836,7 @@ dependencies = [ [[package]] name = "aptos-logger" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-infallible", "aptos-log-derive", @@ -1860,7 +1860,7 @@ dependencies = [ [[package]] name = "aptos-memory-usage-tracker" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-gas-algebra", "aptos-gas-meter", @@ -1873,7 +1873,7 @@ dependencies = [ [[package]] name = "aptos-mempool" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-bounded-executor", @@ -1913,7 +1913,7 @@ dependencies = [ [[package]] name = "aptos-mempool-notifications" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-types", "async-trait", @@ -1926,7 +1926,7 @@ dependencies = [ [[package]] name = "aptos-memsocket" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-infallible", "bytes 1.7.2", @@ -1937,7 +1937,7 @@ dependencies = [ [[package]] name = "aptos-metrics-core" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "prometheus", @@ -1946,7 +1946,7 @@ dependencies = [ [[package]] name = "aptos-move-stdlib" version = "0.1.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-gas-schedule", "aptos-native-interface", @@ -1977,7 +1977,7 @@ dependencies = [ [[package]] name = "aptos-mvhashmap" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-aggregator", @@ -1998,7 +1998,7 @@ dependencies = [ [[package]] name = "aptos-native-interface" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-gas-algebra", "aptos-gas-schedule", @@ -2015,7 +2015,7 @@ dependencies = [ [[package]] name = "aptos-netcore" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-memsocket", "aptos-proxy", @@ -2032,7 +2032,7 @@ dependencies = [ [[package]] name = "aptos-network" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-bitvec", @@ -2077,7 +2077,7 @@ dependencies = [ [[package]] name = "aptos-node-identity" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-types", @@ -2088,7 +2088,7 @@ dependencies = [ [[package]] name = "aptos-node-resource-metrics" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-build-info", "aptos-infallible", @@ -2104,7 +2104,7 @@ dependencies = [ [[package]] name = "aptos-num-variants" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "proc-macro2", "quote", @@ -2114,7 +2114,7 @@ dependencies = [ [[package]] name = "aptos-openapi" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "async-trait", "percent-encoding", @@ -2127,7 +2127,7 @@ dependencies = [ [[package]] name = "aptos-package-builder" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-framework", @@ -2140,7 +2140,7 @@ dependencies = [ [[package]] name = "aptos-peer-monitoring-service-types" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-config", "aptos-types", @@ -2165,7 +2165,7 @@ dependencies = [ [[package]] name = "aptos-proptest-helpers" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "crossbeam", "proptest", @@ -2187,7 +2187,7 @@ dependencies = [ [[package]] name = "aptos-protos" version = "1.3.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "futures-core", "pbjson", @@ -2199,7 +2199,7 @@ dependencies = [ [[package]] name = "aptos-proxy" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "ipnet", ] @@ -2207,7 +2207,7 @@ dependencies = [ [[package]] name = "aptos-push-metrics" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-logger", "aptos-metrics-core", @@ -2218,7 +2218,7 @@ dependencies = [ [[package]] name = "aptos-resource-viewer" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-types", @@ -2232,7 +2232,7 @@ dependencies = [ [[package]] name = "aptos-rest-client" version = "0.0.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-api-types", @@ -2255,7 +2255,7 @@ dependencies = [ [[package]] name = "aptos-rocksdb-options" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-config", "rocksdb", @@ -2264,7 +2264,7 @@ dependencies = [ [[package]] name = "aptos-runtimes" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "rayon", "tokio", @@ -2273,7 +2273,7 @@ dependencies = [ [[package]] name = "aptos-schemadb" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-infallible", @@ -2290,7 +2290,7 @@ dependencies = [ [[package]] name = "aptos-scratchpad" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-crypto", "aptos-drop-helper", @@ -2309,7 +2309,7 @@ dependencies = [ [[package]] name = "aptos-sdk" version = "0.0.3" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-cached-packages", @@ -2331,7 +2331,7 @@ dependencies = [ [[package]] name = "aptos-sdk-builder" version = "0.2.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-types", @@ -2349,11 +2349,11 @@ dependencies = [ [[package]] name = "aptos-secure-net" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-logger", "aptos-metrics-core", - "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd)", + "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e)", "bcs 0.1.4", "crossbeam-channel", "once_cell", @@ -2367,7 +2367,7 @@ dependencies = [ [[package]] name = "aptos-secure-storage" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-crypto", "aptos-infallible", @@ -2388,7 +2388,7 @@ dependencies = [ [[package]] name = "aptos-short-hex-str" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "mirai-annotations", "serde", @@ -2399,7 +2399,7 @@ dependencies = [ [[package]] name = "aptos-speculative-state-helper" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-infallible", @@ -2410,7 +2410,7 @@ dependencies = [ [[package]] name = "aptos-storage-interface" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-crypto", @@ -2458,7 +2458,7 @@ dependencies = [ [[package]] name = "aptos-table-natives" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-gas-schedule", "aptos-native-interface", @@ -2476,7 +2476,7 @@ dependencies = [ [[package]] name = "aptos-temppath" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "hex", "rand 0.7.3", @@ -2485,7 +2485,7 @@ dependencies = [ [[package]] name = "aptos-time-service" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-infallible", "enum_dispatch", @@ -2498,7 +2498,7 @@ dependencies = [ [[package]] name = "aptos-types" version = "0.0.3" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-bitvec", @@ -2555,12 +2555,12 @@ dependencies = [ [[package]] name = "aptos-utils" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" [[package]] name = "aptos-vault-client" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-crypto", "base64 0.13.1", @@ -2576,7 +2576,7 @@ dependencies = [ [[package]] name = "aptos-vm" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-aggregator", @@ -2626,7 +2626,7 @@ dependencies = [ [[package]] name = "aptos-vm-genesis" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-cached-packages", "aptos-crypto", @@ -2647,7 +2647,7 @@ dependencies = [ [[package]] name = "aptos-vm-logging" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "aptos-crypto", "aptos-logger", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "aptos-vm-types" version = "0.0.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-aggregator", @@ -2684,7 +2684,7 @@ dependencies = [ [[package]] name = "aptos-vm-validator" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "aptos-logger", @@ -4094,6 +4094,7 @@ dependencies = [ "bridge-config", "bridge-service", "bridge-setup", + "chrono", "dot-movement", "futures", "godfig", @@ -8592,7 +8593,7 @@ dependencies = [ "aptos-language-e2e-tests", "aptos-logger", "aptos-mempool", - "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd)", + "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e)", "aptos-sdk", "aptos-storage-interface", "aptos-temppath", @@ -8936,7 +8937,7 @@ checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" [[package]] name = "move-abigen" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "bcs 0.1.4", @@ -8953,7 +8954,7 @@ dependencies = [ [[package]] name = "move-binary-format" version = "0.0.3" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "backtrace", @@ -8968,12 +8969,12 @@ dependencies = [ [[package]] name = "move-borrow-graph" version = "0.0.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" [[package]] name = "move-bytecode-source-map" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "bcs 0.1.4", @@ -8988,7 +8989,7 @@ dependencies = [ [[package]] name = "move-bytecode-spec" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "once_cell", "quote", @@ -8998,7 +8999,7 @@ dependencies = [ [[package]] name = "move-bytecode-utils" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "move-binary-format", @@ -9010,7 +9011,7 @@ dependencies = [ [[package]] name = "move-bytecode-verifier" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "fail", "move-binary-format", @@ -9024,7 +9025,7 @@ dependencies = [ [[package]] name = "move-bytecode-viewer" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "clap 4.5.19", @@ -9039,7 +9040,7 @@ dependencies = [ [[package]] name = "move-cli" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "clap 4.5.19", @@ -9069,7 +9070,7 @@ dependencies = [ [[package]] name = "move-command-line-common" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "difference", @@ -9086,7 +9087,7 @@ dependencies = [ [[package]] name = "move-compiler" version = "0.0.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "bcs 0.1.4", @@ -9112,7 +9113,7 @@ dependencies = [ [[package]] name = "move-compiler-v2" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "abstract-domain-derive", "anyhow", @@ -9143,7 +9144,7 @@ dependencies = [ [[package]] name = "move-core-types" version = "0.0.4" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "arbitrary", @@ -9168,7 +9169,7 @@ dependencies = [ [[package]] name = "move-coverage" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "bcs 0.1.4", @@ -9187,7 +9188,7 @@ dependencies = [ [[package]] name = "move-disassembler" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "clap 4.5.19", @@ -9204,7 +9205,7 @@ dependencies = [ [[package]] name = "move-docgen" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "clap 4.5.19", @@ -9223,7 +9224,7 @@ dependencies = [ [[package]] name = "move-errmapgen" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "move-command-line-common", @@ -9235,7 +9236,7 @@ dependencies = [ [[package]] name = "move-ir-compiler" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "bcs 0.1.4", @@ -9251,7 +9252,7 @@ dependencies = [ [[package]] name = "move-ir-to-bytecode" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "codespan-reporting", @@ -9269,7 +9270,7 @@ dependencies = [ [[package]] name = "move-ir-to-bytecode-syntax" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "hex", @@ -9282,7 +9283,7 @@ dependencies = [ [[package]] name = "move-ir-types" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "hex", "move-command-line-common", @@ -9295,7 +9296,7 @@ dependencies = [ [[package]] name = "move-model" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "codespan", @@ -9321,7 +9322,7 @@ dependencies = [ [[package]] name = "move-package" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "clap 4.5.19", @@ -9355,7 +9356,7 @@ dependencies = [ [[package]] name = "move-prover" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "atty", @@ -9382,7 +9383,7 @@ dependencies = [ [[package]] name = "move-prover-boogie-backend" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "async-trait", @@ -9411,7 +9412,7 @@ dependencies = [ [[package]] name = "move-prover-bytecode-pipeline" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "abstract-domain-derive", "anyhow", @@ -9428,7 +9429,7 @@ dependencies = [ [[package]] name = "move-resource-viewer" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "hex", @@ -9455,7 +9456,7 @@ dependencies = [ [[package]] name = "move-stackless-bytecode" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "abstract-domain-derive", "codespan-reporting", @@ -9474,7 +9475,7 @@ dependencies = [ [[package]] name = "move-stdlib" version = "0.1.1" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "hex", @@ -9497,7 +9498,7 @@ dependencies = [ [[package]] name = "move-symbol-pool" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "once_cell", "serde", @@ -9506,7 +9507,7 @@ dependencies = [ [[package]] name = "move-table-extension" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "better_any", "bytes 1.7.2", @@ -9521,7 +9522,7 @@ dependencies = [ [[package]] name = "move-unit-test" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "better_any", @@ -9549,7 +9550,7 @@ dependencies = [ [[package]] name = "move-vm-runtime" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "better_any", "bytes 1.7.2", @@ -9573,7 +9574,7 @@ dependencies = [ [[package]] name = "move-vm-test-utils" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "anyhow", "bytes 1.7.2", @@ -9588,7 +9589,7 @@ dependencies = [ [[package]] name = "move-vm-types" version = "0.1.0" -source = "git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd#70be3926ff79ff4cdb0cee928f717fafcd41ecdd" +source = "git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e#7a0e210fe29e2c81c378568eba2b467a7ef6a56e" dependencies = [ "bcs 0.1.4", "derivative", @@ -13233,7 +13234,7 @@ name = "suzuka-client" version = "0.0.2" dependencies = [ "anyhow", - "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=70be3926ff79ff4cdb0cee928f717fafcd41ecdd)", + "aptos-protos 1.3.0 (git+https://github.com/movementlabsxyz/aptos-core?rev=7a0e210fe29e2c81c378568eba2b467a7ef6a56e)", "aptos-sdk", "aptos-types", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 04db262d7..9ef967faa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -114,40 +114,40 @@ serde_yaml = "0.9.34" ## Aptos dependencies ### We use a forked version so that we can override dependency versions. This is required ### to be avoid dependency conflicts with other Sovereign Labs crates. -aptos-api = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-api-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-bitvec = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-block-executor = { git = "https://github.com/movementlabsxyz/aptos-core.git", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-cached-packages = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-config = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-consensus-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-crypto = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd", features = [ +aptos-api = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-api-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-bitvec = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-block-executor = { git = "https://github.com/movementlabsxyz/aptos-core.git", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-cached-packages = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-config = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-consensus-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-crypto = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e", features = [ "cloneable-private-keys", ] } -aptos-db = { git = "https://github.com/movementlabsxyz/aptos-core.git", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-executor = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-executor-test-helpers = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-executor-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-faucet-core = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-framework = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-language-e2e-tests = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-mempool = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-proptest-helpers = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-sdk = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-state-view = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-storage-interface = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-temppath = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-vm = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-vm-genesis = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-vm-logging = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-vm-validator = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-logger = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-vm-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-indexer = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-indexer-grpc-fullnode = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-indexer-grpc-table-info = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } -aptos-protos = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "70be3926ff79ff4cdb0cee928f717fafcd41ecdd" } +aptos-db = { git = "https://github.com/movementlabsxyz/aptos-core.git", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-executor = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-executor-test-helpers = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-executor-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-faucet-core = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-framework = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-language-e2e-tests = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-mempool = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-proptest-helpers = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-sdk = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-state-view = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-storage-interface = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-temppath = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-vm = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-vm-genesis = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-vm-logging = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-vm-validator = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-logger = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-vm-types = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-indexer = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-indexer-grpc-fullnode = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-indexer-grpc-table-info = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } +aptos-protos = { git = "https://github.com/movementlabsxyz/aptos-core", rev = "7a0e210fe29e2c81c378568eba2b467a7ef6a56e" } # Indexer processor = { git = "https://github.com/movementlabsxyz/aptos-indexer-processors", rev = "8e83cde3cb75fabdade9485e0af680cc4b73ca8e", subdir = "rust" } diff --git a/protocol-units/bridge/config/src/common/movement.rs b/protocol-units/bridge/config/src/common/movement.rs index a3053b4e1..d998f207a 100644 --- a/protocol-units/bridge/config/src/common/movement.rs +++ b/protocol-units/bridge/config/src/common/movement.rs @@ -10,8 +10,8 @@ const DEFAULT_MVT_FAUCET_CONNECTION_PORT: u16 = 8081; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MovementConfig { - #[serde(default = "default_movement_signer_address")] - pub movement_signer_address: Ed25519PrivateKey, + #[serde(default = "default_movement_signer_key")] + pub movement_signer_key: Ed25519PrivateKey, #[serde(default = "default_movement_native_address")] pub movement_native_address: String, @@ -34,8 +34,8 @@ pub struct MovementConfig { } // The default private key -pub fn default_movement_signer_address() -> Ed25519PrivateKey { - match std::env::var("MOVEMENT_SIGNER_ADDRESS") { +pub fn default_movement_signer_key() -> Ed25519PrivateKey { + match std::env::var("MOVEMENT_SIGNER_KEY") { Ok(val) => Ed25519PrivateKey::from_encoded_string(&val).unwrap(), Err(_) => Ed25519PrivateKey::generate(&mut rand::thread_rng()), } @@ -110,12 +110,26 @@ impl MovementConfig { self.mvt_faucet_connection_port ) } + + pub fn suzuka() -> Self { + MovementConfig { + movement_signer_key: Ed25519PrivateKey::from_encoded_string("0x0000000000000000000000000000000000000000000000000000000000000001").unwrap(), + movement_native_address: "0xf90391c81027f03cdea491ed8b36ffaced26b6df208a9b569e5baf2590eb9b16".to_string(), + mvt_rpc_connection_protocol: default_mvt_rpc_connection_protocol(), + mvt_rpc_connection_hostname: default_mvt_rpc_connection_hostname(), + mvt_rpc_connection_port: 30731, + mvt_faucet_connection_protocol: default_mvt_rpc_connection_protocol(), + mvt_faucet_connection_hostname: default_mvt_rpc_connection_hostname(), + mvt_faucet_connection_port: 30732, + mvt_init_network: default_mvt_init_network(), + } + } } impl Default for MovementConfig { fn default() -> Self { MovementConfig { - movement_signer_address: default_movement_signer_address(), + movement_signer_key: default_movement_signer_key(), movement_native_address: default_movement_native_address(), mvt_rpc_connection_protocol: default_mvt_rpc_connection_protocol(), mvt_rpc_connection_hostname: default_mvt_rpc_connection_hostname(), @@ -125,5 +139,6 @@ impl Default for MovementConfig { mvt_faucet_connection_port: default_mvt_faucet_connection_port(), mvt_init_network: default_mvt_init_network(), } + } } diff --git a/protocol-units/bridge/config/src/lib.rs b/protocol-units/bridge/config/src/lib.rs index 49161a8b9..df87e964b 100644 --- a/protocol-units/bridge/config/src/lib.rs +++ b/protocol-units/bridge/config/src/lib.rs @@ -34,3 +34,13 @@ pub fn get_config_path(dot_movement: &dot_movement::DotMovement) -> std::path::P pathbuff.push(BRIDGE_CONF_FOLDER); pathbuff } + +impl Config { + pub fn suzuka() -> Self { + Config { + eth: common::eth::EthConfig::default(), + movement: common::movement::MovementConfig::suzuka(), + testing: common::testing::TestingConfig::default(), + } + } +} \ No newline at end of file diff --git a/protocol-units/bridge/integration-tests/Cargo.toml b/protocol-units/bridge/integration-tests/Cargo.toml index 4347bb6f9..b3e9c18b1 100644 --- a/protocol-units/bridge/integration-tests/Cargo.toml +++ b/protocol-units/bridge/integration-tests/Cargo.toml @@ -19,6 +19,7 @@ aptos-types = { workspace = true } aptos-sdk = { workspace = true } anyhow = { workspace = true } bcs = { workspace = true } +chrono = "0.4" hex = { workspace = true } alloy = { workspace = true } reqwest = { workspace = true } diff --git a/protocol-units/bridge/integration-tests/README.md b/protocol-units/bridge/integration-tests/README.md new file mode 100644 index 000000000..b9837e94c --- /dev/null +++ b/protocol-units/bridge/integration-tests/README.md @@ -0,0 +1,44 @@ +# Running client integration tests against the atomic bridge + +The client integration tests for the framework bridge modules are in `tests`: + +- `client_l1move_l2move.rs` (run with command `rust_backtrace=1 cargo test --test client_l1move_l2move test_movement_client_initiate_transfer -- --nocapture --test-threads=1`) +- `client_l2move_l1move.rs` (run with command `rust_backtrace=1 cargo test --test client_l2move_l1move test_movement_client_initiate_transfer -- --nocapture --test-threads=1`) + +In order to successfully run the tests against a local Suzuka node, the core resource account `0xA550C18` needs to be set to the same private key generated in `config.json`. + +## Steps to run integration tests + +1. Navigate to the root of the `movement` repo, checkout the `andygolay/framework-client-tests` branch, and start a local Suzuka node: + +``` +CELESTIA_LOG_LEVEL=FATAL CARGO_PROFILE=release CARGO_PROFILE_FLAGS=--release nix develop --extra-experimental-features nix-command --extra-experimental-features flakes --command bash -c "just bridge native build.setup.eth-local.celestia-local --keep-tui" +``` + +Note, if you have any `.movement` directories present, e.g. when re-running tests, the directories must be deleted before starting the node. + +2. In the generated `.movement` directory, there will be a `config.yaml`. In that file, change `f90391c81027f03cdea491ed8b36ffaced26b6df208a9b569e5baf2590eb9b16` to `0xA550C18` so the file looks like: + +``` +--- +profiles: + default: + network: Custom + private_key: "0x0000000000000000000000000000000000000000000000000000000000000001" + public_key: "0x4cb5abf6ad79fbf5abbccafcc269d85cd2651ed4b885b5869f241aedf0a5ba29" + account: "0xA550C18" + rest_url: "http://0.0.0.0:30731/" + faucet_url: "http://0.0.0.0:30732/" +``` + +3. Run each set of Movement client tests: + +L1 Move to L2 Move: +``` +rust_backtrace=1 cargo test --test client_l1move_l2move -- --nocapture --test-threads=1 +``` + +L2 Move to L1 Move: +``` +rust_backtrace=1 cargo test --test client_l2move_l1move -- --nocapture --test-threads=1 +``` diff --git a/protocol-units/bridge/integration-tests/src/lib.rs b/protocol-units/bridge/integration-tests/src/lib.rs index 9c353c67d..96a354c93 100644 --- a/protocol-units/bridge/integration-tests/src/lib.rs +++ b/protocol-units/bridge/integration-tests/src/lib.rs @@ -15,13 +15,16 @@ use bridge_service::chains::ethereum::types::AlloyProvider; use bridge_service::chains::ethereum::types::EthAddress; use bridge_service::chains::ethereum::{client::EthClient, types::EthHash}; use bridge_service::chains::movement::utils::MovementAddress; -use bridge_service::chains::movement::{client::MovementClient, utils::MovementHash}; +use bridge_service::chains::movement::{client::MovementClient, client_framework::MovementClientFramework, utils::MovementHash}; use bridge_service::types::Amount; use bridge_service::types::BridgeTransferId; use bridge_service::types::HashLockPreImage; use bridge_service::{chains::bridge_contracts::BridgeContractResult, types::BridgeAddress}; use godfig::{backend::config_file::ConfigFile, Godfig}; use rand::SeedableRng; +use rand::{thread_rng, Rng}; +use rand::distributions::Alphanumeric; +use std::convert::TryInto; use std::str::FromStr; use std::sync::{Arc, RwLock}; use url::Url; @@ -49,29 +52,44 @@ pub struct MovementToEthCallArgs { } impl Default for EthToMovementCallArgs { - fn default() -> Self { - Self { - initiator: b"0x123".to_vec(), - recipient: MovementAddress(AccountAddress::new(*b"0x00000000000000000000000000face")), - bridge_transfer_id: MovementHash(*b"00000000000000000000000transfer1"), - hash_lock: MovementHash(*keccak256(b"secret")), - time_lock: 3600, - amount: 100, - } - } + fn default() -> Self { + // Generate 6 random alphanumeric characters + let random_suffix: String = thread_rng() + .sample_iter(&Alphanumeric) + .take(6) + .map(char::from) + .collect(); + + // Construct the bridge_transfer_id with the random suffix + let mut bridge_transfer_id = b"00000000000000000000000tra".to_vec(); + bridge_transfer_id.extend_from_slice(random_suffix.as_bytes()); + + Self { + // Dummy valid EIP-55 address used in framework modules + initiator: b"32Be343B94f860124dC4fEe278FDCBD38C102D88".to_vec(), + // Dummy recipient address + recipient: MovementAddress(AccountAddress::new(*b"0x00000000000000000000000000face")), + // Convert to [u8; 32] with explicit type annotation + bridge_transfer_id: MovementHash( + bridge_transfer_id + .as_slice() + .try_into() + .expect("Expected bridge_transfer_id to be 32 bytes"), + ), + hash_lock: MovementHash(*keccak256(b"secret")), + time_lock: 3600, + amount: 100, + } + } } impl Default for MovementToEthCallArgs { fn default() -> Self { - let preimage = "secret".to_string(); - let serialized_preimage = bcs::to_bytes(&preimage).unwrap(); - let hash_lock = *keccak256(&serialized_preimage); - Self { - initiator: MovementAddress(AccountAddress::new(*b"0x00000000000000000000000000face")), - recipient: [1; 20].to_vec(), + initiator: MovementAddress(AccountAddress::new(*b"0x000000000000000000000000A55018")), + recipient: b"32Be343B94f860124dC4fEe278FDCBD38C102D88".to_vec(), bridge_transfer_id: EthHash(*b"00000000000000000000000transfer1"), - hash_lock: EthHash(hash_lock), + hash_lock: EthHash(*keccak256(b"secret")), time_lock: 3600, amount: 100, } @@ -248,10 +266,10 @@ impl TestHarness { ) -> Result<(HarnessEthClient, HarnessMvtClient, Config), anyhow::Error> { let config = TestHarness::read_bridge_config().await?; - let test_mvt_hadness = HarnessMvtClient::build(&config).await; - let test_eth_hadness = HarnessEthClient::build(&config).await; + let test_mvt_harness = HarnessMvtClient::build(&config).await; + let test_eth_harness = HarnessEthClient::build(&config).await; - Ok((test_eth_hadness, test_mvt_hadness, config)) + Ok((test_eth_harness, test_mvt_harness, config)) } pub async fn new_with_movement( @@ -261,9 +279,9 @@ impl TestHarness { .await .expect("Failed to setup Movement config"); - let test_hadness = HarnessMvtClient::build(&config).await; + let test_harness = HarnessMvtClient::build(&config).await; - (test_hadness, config, movement_process) + (test_harness, config, movement_process) } pub async fn new_only_eth(config: Config) -> (HarnessEthClient, Config, AnvilInstance) { @@ -274,3 +292,90 @@ impl TestHarness { (test_hadness, config, anvil) } } + +pub struct HarnessMvtClientFramework { + pub movement_client: MovementClientFramework, + ///The Apotos Rest Client + pub rest_client: Client, + ///The Apotos Rest Client + pub faucet_client: Arc>, +} + +impl HarnessMvtClientFramework { + pub fn gen_aptos_account() -> Vec { + let mut rng = ::rand::rngs::StdRng::from_seed([3u8; 32]); + let movement_recipient = LocalAccount::generate(&mut rng); + movement_recipient.public_key().to_bytes().to_vec() + } + + pub async fn build(config: &Config) -> Self { + let movement_client = MovementClientFramework::new(&config.movement) + .await + .expect("Failed to create MovementClient"); + + let node_connection_url = Url::from_str(&config.movement.mvt_rpc_connection_url()) + .expect("Bad movement rpc url in config"); + let rest_client = Client::new(node_connection_url.clone()); + + let faucet_url = Url::from_str(&config.movement.mvt_faucet_connection_url()) + .expect("Bad movement faucet url in config"); + let faucet_client = Arc::new(RwLock::new(FaucetClient::new( + faucet_url.clone(), + node_connection_url.clone(), + ))); + + HarnessMvtClientFramework { movement_client, rest_client, faucet_client } + } +} + +pub struct TestHarnessFramework; +impl TestHarnessFramework { + pub async fn read_bridge_config() -> Result { + let mut dot_movement = dot_movement::DotMovement::try_from_env()?; + let pathbuff = bridge_config::get_config_path(&dot_movement); + dot_movement.set_path(pathbuff); + let config_file = dot_movement.try_get_or_create_config_file().await?; + + // get a matching godfig object + let godfig: Godfig = Godfig::new(ConfigFile::new(config_file), vec![]); + let bridge_config: Config = godfig.try_wait_for_ready().await?; + Ok(bridge_config) + } + + pub async fn new_with_eth_and_movement( + ) -> Result<(HarnessEthClient, HarnessMvtClientFramework, Config), anyhow::Error> { + let config = TestHarnessFramework::read_bridge_config().await?; + + let test_mvt_harness = HarnessMvtClientFramework::build(&config).await; + let test_eth_harness = HarnessEthClient::build(&config).await; + + Ok((test_eth_harness, test_mvt_harness, config)) + } + + pub async fn new_with_movement( + config: Config, + ) -> (HarnessMvtClientFramework, Config, tokio::process::Child) { + let (config, movement_process) = bridge_setup::test_mvt_setup(config) + .await + .expect("Failed to setup Movement config"); + + let test_harness = HarnessMvtClientFramework::build(&config).await; + + (test_harness, config, movement_process) + } + + pub async fn new_with_suzuka( + config: Config, + ) -> (HarnessMvtClientFramework, Config) { + let test_harness = HarnessMvtClientFramework::build(&config).await; + (test_harness, config) + } + + pub async fn new_only_eth(config: Config) -> (HarnessEthClient, Config, AnvilInstance) { + let (config, anvil) = bridge_setup::test_eth_setup(config) + .await + .expect("Test eth config setup failed."); + let test_harness = HarnessEthClient::build(&config).await; + (test_harness, config, anvil) + } +} diff --git a/protocol-units/bridge/integration-tests/src/utils.rs b/protocol-units/bridge/integration-tests/src/utils.rs index 817e7a657..5933b885c 100644 --- a/protocol-units/bridge/integration-tests/src/utils.rs +++ b/protocol-units/bridge/integration-tests/src/utils.rs @@ -1,18 +1,23 @@ #![allow(dead_code)] -use crate::HarnessMvtClient; +use crate::{HarnessMvtClient, HarnessMvtClientFramework}; use alloy::hex; use anyhow::Result; use aptos_sdk::{ coin_client::CoinClient, rest_client::Transaction, types::account_address::AccountAddress, }; use bridge_service::chains::bridge_contracts::{BridgeContract, BridgeContractError}; -use bridge_service::chains::movement::client::MovementClient; +use bridge_service::chains::movement::{client::MovementClient, client_framework::MovementClientFramework}; use bridge_service::chains::movement::utils::{ self as movement_utils, MovementAddress, MovementHash, }; use bridge_service::types::{Amount, AssetType, BridgeAddress, BridgeTransferDetails, HashLock}; +use serde_json::Value; use tracing::debug; +const FRAMEWORK_ADDRESS: AccountAddress = AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, +]); + pub fn assert_bridge_transfer_details( details: &BridgeTransferDetails, // MovementAddress for initiator expected_bridge_transfer_id: [u8; 32], @@ -30,6 +35,23 @@ pub fn assert_bridge_transfer_details( assert_eq!(details.state, expected_state, "Bridge transfer state mismatch."); } +pub fn assert_counterparty_bridge_transfer_details_framework( + details: &BridgeTransferDetails, + expected_sender_address: String, + expected_recipient_address: Vec, + expected_amount: u64, + expected_hash_lock: [u8; 32], + expected_time_lock: u64 +) { + + + assert_eq!(details.initiator_address.to_string(), expected_sender_address); + assert_eq!(details.recipient_address, BridgeAddress(expected_recipient_address)); + assert_eq!(details.amount, Amount(AssetType::Moveth(expected_amount))); + assert_eq!(details.hash_lock.0, expected_hash_lock); + assert_eq!(details.time_lock.0, expected_time_lock); +} + pub async fn extract_bridge_transfer_id( movement_client: &mut MovementClient, ) -> Result<[u8; 32], anyhow::Error> { @@ -73,6 +95,78 @@ pub async fn extract_bridge_transfer_id( Err(anyhow::Error::msg("No matching transaction found")) } +pub async fn extract_bridge_transfer_id_framework( + movement_client: &mut MovementClientFramework, +) -> Result<[u8; 32], anyhow::Error> { + let sender_address = movement_client.signer().address(); + let sequence_number = 0; + let rest_client = movement_client.rest_client(); + debug!("Sender address: {:?}", sender_address); + + let transactions = rest_client + .get_account_transactions(sender_address, Some(sequence_number), Some(20)) + .await + .map_err(|e| anyhow::Error::msg(format!("Failed to get transactions: {:?}", e)))?; + + if let Some(transaction) = transactions.into_inner().last() { + if let Transaction::UserTransaction(user_txn) = transaction { + for event in &user_txn.events { + if let aptos_sdk::rest_client::aptos_api_types::MoveType::Struct(struct_tag) = + &event.typ + { + match struct_tag.name.as_str() { + "BridgeTransferInitiatedEvent" | "BridgeTransferLockedEvent" => { + if let Some(bridge_transfer_id_str) = + event.data.get("bridge_transfer_id").and_then(|v| v.as_str()) + { + let bridge_transfer_id_vec = hex::decode(bridge_transfer_id_str.trim_start_matches("0x")) + .map_err(|_| anyhow::Error::msg("Failed to decode hex string into Vec"))?; + let bridge_transfer_id: [u8; 32] = bridge_transfer_id_vec.try_into() + .map_err(|_| anyhow::Error::msg("Failed to convert Vec to [u8; 32]"))?; + + return Ok(bridge_transfer_id); + } + } + _ => {} + } + } + } + } + } + Err(anyhow::Error::msg("No matching transaction found")) +} + +pub async fn fetch_bridge_transfer_details( + movement_client: &mut MovementClientFramework, + bridge_transfer_id: Vec, +) -> Result, anyhow::Error> { + let rest_client = movement_client.rest_client(); + let account_address = FRAMEWORK_ADDRESS; + let resource_tag = "0x1::atomic_bridge_store::SmartTableWrapper, 0x1::atomic_bridge_store::BridgeTransferDetails>"; + + let resource_response = rest_client + .get_account_resource(account_address, resource_tag) + .await + .map_err(|e| anyhow::Error::msg(format!("Failed to fetch resource: {:?}", e)))?; + + let json_value: Value = resource_response.into_inner().unwrap().data; + + if let Some(transfers) = json_value.get("inner").and_then(|t| t.get("buckets")) { + for (key, value) in transfers.as_object().unwrap().iter() { + let key_vec = hex::decode(key).expect("Failed to decode key"); // Convert the key into Vec + + if key_vec == bridge_transfer_id { + let bridge_transfer_details: BridgeTransferDetails = + serde_json::from_value(value.clone()) + .map_err(|e| anyhow::Error::msg(format!("Failed to deserialize BridgeTransferDetails: {:?}", e)))?; + return Ok(bridge_transfer_details); + } + } + } + + Err(anyhow::Error::msg("No matching bridge transfer details found")) +} + pub async fn fund_and_check_balance( movement_harness: &mut HarnessMvtClient, expected_balance: u64, @@ -82,6 +176,7 @@ pub async fn fund_and_check_balance( let coin_client = CoinClient::new(&rest_client); let faucet_client = movement_harness.faucet_client.write().unwrap(); faucet_client.fund(movement_client_signer.address(), expected_balance).await?; + faucet_client.fund(AccountAddress::from_hex_literal("0xface")?, expected_balance).await?; let balance = coin_client.get_account_balance(&movement_client_signer.address()).await?; assert!( @@ -94,8 +189,25 @@ pub async fn fund_and_check_balance( Ok(()) } -pub async fn publish_for_test(movement_client: &mut MovementClient) { - let _ = movement_client.publish_for_test(); +pub async fn fund_and_check_balance_framework( + movement_harness: &mut HarnessMvtClientFramework, + expected_balance: u64, +) -> Result<()> { + let movement_client_signer = movement_harness.movement_client.signer(); + let rest_client = movement_harness.rest_client.clone(); + let coin_client = CoinClient::new(&rest_client); + let faucet_client = movement_harness.faucet_client.write().unwrap(); + faucet_client.fund(movement_client_signer.address(), expected_balance).await?; + + let balance = coin_client.get_account_balance(&movement_client_signer.address()).await?; + assert!( + balance >= expected_balance, + "Expected Movement Client to have at least {}, but found {}", + expected_balance, + balance + ); + + Ok(()) } pub async fn initiate_bridge_transfer_helper( @@ -153,3 +265,23 @@ pub async fn initiate_bridge_transfer_helper( Ok(()) } + +pub async fn initiate_bridge_transfer_helper_framework( + movement_client: &mut MovementClientFramework, + initiator_address: AccountAddress, + recipient_address: Vec, + hash_lock: [u8; 32], + amount: u64, +) -> Result<(), BridgeContractError> { + movement_client + .initiate_bridge_transfer( + BridgeAddress(MovementAddress(initiator_address)), + BridgeAddress(recipient_address), + HashLock(MovementHash(hash_lock).0), + Amount(AssetType::Moveth(amount)), + ) + .await + .expect("Failed to initiate bridge transfer"); + + Ok(()) +} diff --git a/protocol-units/bridge/integration-tests/tests/bridge_e2e_test.rs b/protocol-units/bridge/integration-tests/tests/bridge_e2e_test.rs index 7ba74709b..459e71167 100644 --- a/protocol-units/bridge/integration-tests/tests/bridge_e2e_test.rs +++ b/protocol-units/bridge/integration-tests/tests/bridge_e2e_test.rs @@ -78,7 +78,7 @@ async fn test_bridge_transfer_eth_movement_happy_path() -> Result<(), anyhow::Er ) .init(); - let (eth_client_harness, mut mvt_client_harness, config) = + let (_eth_client_harness, mut mvt_client_harness, config) = TestHarness::new_with_eth_and_movement().await?; tracing::info!("Init initiator and counter part test account."); @@ -126,7 +126,7 @@ async fn test_bridge_transfer_eth_movement_happy_path() -> Result<(), anyhow::Er //send counter complete event. tracing::info!("Call counterparty_complete_bridge_transfer on MVT."); - let tx = mvt_client_harness + mvt_client_harness .counterparty_complete_bridge_transfer( recipient_privkey, bridge_tranfer_id, @@ -148,7 +148,6 @@ async fn test_bridge_transfer_eth_movement_happy_path() -> Result<(), anyhow::Er Ok(()) } -use aptos_sdk::crypto::ed25519::Ed25519PublicKey; #[tokio::test] async fn test_movement_event() -> Result<(), anyhow::Error> { tracing_subscriber::fmt() @@ -183,7 +182,7 @@ async fn test_movement_event() -> Result<(), anyhow::Error> { let mut movement_client = MovementClient::new(&config.movement).await.unwrap(); let args = MovementToEthCallArgs::default(); - // let signer_privkey = config.movement.movement_signer_address.clone(); + // let signer_privkey = config.movement.movement_signer_key.clone(); // let sender_address = format!("0x{}", Ed25519PublicKey::from(&signer_privkey).to_string()); // let sender_address = movement_client.signer().address(); // test_utils::fund_and_check_balance(&mut mvt_client_harness, 100_000_000_000).await?; @@ -205,7 +204,7 @@ async fn test_movement_event() -> Result<(), anyhow::Error> { config.movement.movement_native_address ); - // let signer_privkey = config.movement.movement_signer_address.clone(); + // let signer_privkey = config.movement.movement_signer_key.clone(); // let signer_public_key = format!("0x{}", Ed25519PublicKey::from(&signer_privkey).to_string()); // println!("signer_public_key {signer_public_key}",); diff --git a/protocol-units/bridge/integration-tests/tests/client_eth_movement.rs b/protocol-units/bridge/integration-tests/tests/client_eth_movement.rs index 3566e4bd6..8fdf6cb88 100644 --- a/protocol-units/bridge/integration-tests/tests/client_eth_movement.rs +++ b/protocol-units/bridge/integration-tests/tests/client_eth_movement.rs @@ -114,11 +114,11 @@ async fn test_movement_client_should_successfully_call_lock_and_complete( assert_eq!(details.bridge_transfer_id.0, args.bridge_transfer_id.0); assert_eq!(details.hash_lock.0, args.hash_lock.0); assert_eq!( - &details.initiator_address.0 .0[32 - args.initiator.len()..], + &details.initiator_address.0, &args.initiator, "Initiator address does not match" ); - assert_eq!(details.recipient_address.0, args.recipient.0.to_vec()); + assert_eq!(details.recipient_address.0, args.recipient); assert_eq!(details.amount.0, AssetType::Moveth(args.amount)); assert_eq!(details.state, 1, "Bridge transfer is supposed to be locked but it's not."); @@ -145,11 +145,11 @@ async fn test_movement_client_should_successfully_call_lock_and_complete( assert_eq!(details.bridge_transfer_id.0, args.bridge_transfer_id.0); assert_eq!(details.hash_lock.0, args.hash_lock.0); assert_eq!( - &details.initiator_address.0 .0[32 - args.initiator.len()..], + &details.initiator_address.0, &args.initiator, "Initiator address does not match" ); - assert_eq!(details.recipient_address.0, args.recipient.0.to_vec()); + assert_eq!(details.recipient_address.0, args.recipient); assert_eq!(details.amount.0, AssetType::Moveth(args.amount)); assert_eq!(details.state, 2, "Bridge transfer is supposed to be completed but it's not."); @@ -224,11 +224,11 @@ async fn test_movement_client_should_successfully_call_lock_and_abort() -> Resul assert_eq!(details.bridge_transfer_id.0, args.bridge_transfer_id.0); assert_eq!(details.hash_lock.0, args.hash_lock.0); assert_eq!( - &details.initiator_address.0 .0[32 - args.initiator.len()..], + &details.initiator_address.0, &args.initiator, "Initiator address does not match" ); - assert_eq!(details.recipient_address.0, args.recipient.0.to_vec()); + assert_eq!(details.recipient_address.0, args.recipient); assert_eq!(details.amount.0, AssetType::Moveth(args.amount)); assert_eq!(details.state, 1, "Bridge transfer is supposed to be locked but it's not."); @@ -251,11 +251,11 @@ async fn test_movement_client_should_successfully_call_lock_and_abort() -> Resul assert_eq!(abort_details.bridge_transfer_id.0, args.bridge_transfer_id.0); assert_eq!(abort_details.hash_lock.0, args.hash_lock.0); assert_eq!( - &abort_details.initiator_address.0 .0[32 - args.initiator.len()..], + &abort_details.initiator_address.0, &args.initiator, "Initiator address does not match" ); - assert_eq!(abort_details.recipient_address.0, args.recipient.0.to_vec()); + assert_eq!(abort_details.recipient_address.0, args.recipient); assert_eq!(abort_details.amount.0, AssetType::Moveth(args.amount)); Ok(()) diff --git a/protocol-units/bridge/integration-tests/tests/client_l1move_l2move.rs b/protocol-units/bridge/integration-tests/tests/client_l1move_l2move.rs new file mode 100644 index 000000000..0afe0ae38 --- /dev/null +++ b/protocol-units/bridge/integration-tests/tests/client_l1move_l2move.rs @@ -0,0 +1,409 @@ +use alloy::primitives::{address, keccak256}; +use anyhow::Result; +use aptos_sdk::types::account_address::AccountAddress; +use aptos_sdk::coin_client::CoinClient; +use bridge_config::Config; +use bridge_integration_tests::EthToMovementCallArgs; +use bridge_integration_tests::HarnessMvtClient; +use bridge_integration_tests::{TestHarness, TestHarnessFramework}; +use bridge_service::chains::{ethereum::types::EthAddress, movement::client_framework::MovementClientFramework}; +use bridge_service::chains::{ + bridge_contracts::BridgeContract, ethereum::types::EthHash +}; +use bridge_service::types::{ + Amount, AssetType, BridgeAddress, BridgeTransferId, HashLock, HashLockPreImage, +}; +use tokio::time::{sleep, Duration}; +use tokio::{self}; +use tracing::info; + +#[tokio::test] +async fn test_movement_client_lock_transfer( +) -> Result<(), anyhow::Error> { + let _ = tracing_subscriber::fmt().with_max_level(tracing::Level::DEBUG).try_init(); + MovementClientFramework::bridge_setup_scripts().await?; + let config: Config = Config::suzuka(); + let (mut mvt_client_harness, _config) = TestHarnessFramework::new_with_suzuka(config).await; + let args = EthToMovementCallArgs::default(); + let test_result = async { + let coin_client = CoinClient::new(&mvt_client_harness.rest_client); + let movement_client_signer = mvt_client_harness.movement_client.signer(); + + { + let faucet_client = mvt_client_harness.faucet_client.write().unwrap(); + faucet_client.fund(movement_client_signer.address(), 100_000_000).await?; + } + + let balance = coin_client.get_account_balance(&movement_client_signer.address()).await?; + assert!( + balance >= 100_000_000, + "Expected Movement Client to have at least 100_000_000, but found {}", + balance + ); + + mvt_client_harness + .movement_client + .lock_bridge_transfer( + BridgeTransferId(args.bridge_transfer_id.0), + HashLock(args.hash_lock.0), + BridgeAddress(args.initiator.clone()), + BridgeAddress(args.recipient.clone().into()), + Amount(AssetType::Moveth(args.amount)), + ) + .await + .expect("Failed to lock bridge transfer"); + + let details = BridgeContract::get_bridge_transfer_details_counterparty( + &mut mvt_client_harness.movement_client, + BridgeTransferId(args.bridge_transfer_id.0), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + assert_eq!(details.state, 1, "Bridge transfer should be pending."); + info!("Bridge transfer details: {:?}", details); + Ok(()) + } + .await; + + test_result +} + +#[tokio::test] +async fn test_movement_client_complete_transfer( +) -> Result<(), anyhow::Error> { + let _ = tracing_subscriber::fmt().with_max_level(tracing::Level::DEBUG).try_init(); + MovementClientFramework::bridge_setup_scripts().await?; + let config: Config = Config::suzuka(); + let (mut mvt_client_harness, _config) = TestHarnessFramework::new_with_suzuka(config).await; + let args = EthToMovementCallArgs::default(); + let test_result = async { + let coin_client = CoinClient::new(&mvt_client_harness.rest_client); + let movement_client_signer = mvt_client_harness.movement_client.signer(); + { + let faucet_client = mvt_client_harness.faucet_client.write().unwrap(); + faucet_client.fund(movement_client_signer.address(), 100_000_000).await?; + faucet_client.fund(AccountAddress::from_hex_literal("0xface")?, 100_000_000).await?; + faucet_client.fund(AccountAddress::from_hex_literal("0x1")?, 100_000_000).await?; + // This address is the recipient in test_movement_client_complete_transfer, so it needs an AptosCoin store + faucet_client.fund(AccountAddress::from_hex_literal("0x3078303030303030303030303030303030303030303030303030303066616365")?, 100_000_000).await?; + + } + let balance = coin_client.get_account_balance(&movement_client_signer.address()).await?; + assert!( + balance >= 100_000_000, + "Expected Movement Client to have at least 100_000_000, but found {}", + balance + ); + + mvt_client_harness + .movement_client + .lock_bridge_transfer( + BridgeTransferId(args.bridge_transfer_id.0), + HashLock(args.hash_lock.0), + BridgeAddress(args.initiator.clone()), + BridgeAddress(args.recipient.clone().into()), + Amount(AssetType::Moveth(args.amount)), + ) + .await + .expect("Failed to lock bridge transfer"); + + let details = BridgeContract::get_bridge_transfer_details_counterparty( + &mut mvt_client_harness.movement_client, + BridgeTransferId(args.bridge_transfer_id.0), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + info!("Recipient: {:?}", details.recipient_address); + + assert_eq!(details.state, 1, "Bridge transfer should be pending."); + info!("Bridge transfer details: {:?}", details); + + let secret = b"secret"; + let mut padded_secret = [0u8; 32]; + padded_secret[..secret.len()].copy_from_slice(secret); + + BridgeContract::counterparty_complete_bridge_transfer( + &mut mvt_client_harness.movement_client, + BridgeTransferId(args.bridge_transfer_id.0), + HashLockPreImage(padded_secret), + ) + .await + .expect("Failed to complete bridge transfer"); + + let details = BridgeContract::get_bridge_transfer_details_counterparty( + &mut mvt_client_harness.movement_client, + BridgeTransferId(args.bridge_transfer_id.0), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + assert_eq!(details.bridge_transfer_id.0, args.bridge_transfer_id.0); + assert_eq!(details.hash_lock.0, args.hash_lock.0); + assert_eq!( + &details.initiator_address.0, + &args.initiator, + "Initiator address does not match" + ); + assert_eq!(details.recipient_address.0, args.recipient); + assert_eq!(details.amount.0, AssetType::Moveth(args.amount)); + assert_eq!(details.state, 2, "Bridge transfer is supposed to be completed but it's not."); + + Ok(()) + } + .await; + + test_result +} + +#[tokio::test] +async fn test_movement_client_abort_transfer( +) -> Result<(), anyhow::Error> { + let _ = tracing_subscriber::fmt().with_max_level(tracing::Level::DEBUG).try_init(); + MovementClientFramework::bridge_setup_scripts().await?; + let config: Config = Config::suzuka(); + let (mut mvt_client_harness, _config) = TestHarnessFramework::new_with_suzuka(config).await; + let args = EthToMovementCallArgs::default(); + let test_result = async { + let coin_client = CoinClient::new(&mvt_client_harness.rest_client); + let movement_client_signer = mvt_client_harness.movement_client.signer(); + + { + let faucet_client = mvt_client_harness.faucet_client.write().unwrap(); + faucet_client.fund(movement_client_signer.address(), 100_000_000).await?; + } + + let balance = coin_client.get_account_balance(&movement_client_signer.address()).await?; + assert!( + balance >= 100_000_000, + "Expected Movement Client to have at least 100_000_000, but found {}", + balance + ); + + mvt_client_harness + .movement_client + .lock_bridge_transfer( + BridgeTransferId(args.bridge_transfer_id.0), + HashLock(args.hash_lock.0), + BridgeAddress(args.initiator.clone()), + BridgeAddress(args.recipient.clone().into()), + Amount(AssetType::Moveth(args.amount)), + ) + .await + .expect("Failed to lock bridge transfer"); + + let details = BridgeContract::get_bridge_transfer_details_counterparty( + &mut mvt_client_harness.movement_client, + BridgeTransferId(args.bridge_transfer_id.0), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + info!("Bridge transfer details: {:?}", details); + + assert_eq!(details.state, 1, "Bridge transfer should be pending."); + + sleep(Duration::from_secs(20)).await; + + let secret = b"secret"; + let mut padded_secret = [0u8; 32]; + padded_secret[..secret.len()].copy_from_slice(secret); + + BridgeContract::abort_bridge_transfer( + &mut mvt_client_harness.movement_client, + BridgeTransferId(args.bridge_transfer_id.0) + ) + .await + .expect("Failed to complete bridge transfer"); + + let details = BridgeContract::get_bridge_transfer_details_counterparty( + &mut mvt_client_harness.movement_client, + BridgeTransferId(args.bridge_transfer_id.0), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + assert_eq!(details.bridge_transfer_id.0, args.bridge_transfer_id.0); + assert_eq!(details.hash_lock.0, args.hash_lock.0); + assert_eq!( + &details.initiator_address.0, + &args.initiator, + "Initiator address does not match" + ); + assert_eq!(details.recipient_address.0, args.recipient); + assert_eq!(details.amount.0, AssetType::Moveth(args.amount)); + assert_eq!(details.state, 3, "Bridge transfer is supposed to be cancelled but it's not."); + + Ok(()) + } + .await; + + test_result +} + +#[tokio::test] +async fn test_eth_client_should_deploy_initiator_contract() { + let config = Config::default(); + let (_eth_client_harness, config, _anvil) = TestHarness::new_only_eth(config).await; + + assert!(config.eth.eth_initiator_contract != "Oxeee"); + assert_eq!( + config.eth.eth_initiator_contract, "0x8464135c8F25Da09e49BC8782676a84730C318bC", + "Wrong initiator contract address." + ); +} + +#[tokio::test] +async fn test_eth_client_should_successfully_call_initialize() { + let config = Config::default(); + let (_eth_client_harness, config, _anvil) = TestHarness::new_only_eth(config).await; + assert!(config.eth.eth_counterparty_contract != "0xccc"); + assert_eq!( + config.eth.eth_counterparty_contract, "0x71C95911E9a5D330f4D621842EC243EE1343292e", + "Wrong initiator contract address." + ); + assert!(config.eth.eth_weth_contract != "0xe3e3"); + assert_eq!( + config.eth.eth_weth_contract, "0x948B3c65b89DF0B4894ABE91E6D02FE579834F8F", + "Wrong initiator contract address." + ); +} + +#[tokio::test] +async fn test_eth_client_should_successfully_call_initiate_transfer_only_eth() { + let config = Config::default(); + let (mut eth_client_harness, _config, _anvil) = TestHarness::new_only_eth(config).await; + + let signer_address: alloy::primitives::Address = eth_client_harness.signer_address(); + + let recipient = HarnessMvtClient::gen_aptos_account(); + let hash_lock: [u8; 32] = keccak256("secret".to_string().as_bytes()).into(); + eth_client_harness + .eth_client + .initiate_bridge_transfer( + BridgeAddress(EthAddress(signer_address)), + BridgeAddress(recipient), + HashLock(EthHash(hash_lock).0), + Amount(AssetType::EthAndWeth((1, 0))), // Eth + ) + .await + .expect("Failed to initiate bridge transfer"); +} + +#[tokio::test] +async fn test_eth_client_should_successfully_call_initiate_transfer_only_weth() { + let config = Config::default(); + let (mut eth_client_harness, _config, _anvil) = TestHarness::new_only_eth(config).await; + + let signer_address: alloy::primitives::Address = eth_client_harness.signer_address(); + + let recipient = HarnessMvtClient::gen_aptos_account(); + let hash_lock: [u8; 32] = keccak256("secret".to_string().as_bytes()).into(); + eth_client_harness + .deposit_weth_and_approve( + BridgeAddress(EthAddress(signer_address)), + Amount(AssetType::EthAndWeth((0, 1))), + ) + .await + .expect("Failed to deposit WETH"); + + eth_client_harness + .eth_client + .initiate_bridge_transfer( + BridgeAddress(EthAddress(signer_address)), + BridgeAddress(recipient), + HashLock(EthHash(hash_lock).0), + Amount(AssetType::EthAndWeth((0, 1))), + ) + .await + .expect("Failed to initiate bridge transfer"); +} + +#[tokio::test] +async fn test_eth_client_should_successfully_call_initiate_transfer_eth_and_weth() { + let config = Config::default(); + let (mut eth_client_harness, _config, _anvil) = TestHarness::new_only_eth(config).await; + + let signer_address: alloy::primitives::Address = eth_client_harness.signer_address(); + + let recipient = HarnessMvtClient::gen_aptos_account(); + let hash_lock: [u8; 32] = keccak256("secret".to_string().as_bytes()).into(); + eth_client_harness + .deposit_weth_and_approve( + BridgeAddress(EthAddress(signer_address)), + Amount(AssetType::EthAndWeth((0, 1))), + ) + .await + .expect("Failed to deposit WETH"); + + eth_client_harness + .eth_client + .initiate_bridge_transfer( + BridgeAddress(EthAddress(signer_address)), + BridgeAddress(recipient), + HashLock(EthHash(hash_lock).0), + Amount(AssetType::EthAndWeth((1, 1))), + ) + .await + .expect("Failed to initiate bridge transfer"); +} + +#[tokio::test] +#[ignore] // To be tested after this is merged in https://github.com/movementlabsxyz/movement/pull/209 +async fn test_client_should_successfully_get_bridge_transfer_id() { + let config = Config::default(); + let (mut eth_client_harness, _config, _anvil) = TestHarness::new_only_eth(config).await; + + let signer_address: alloy::primitives::Address = eth_client_harness.signer_address(); + + let recipient = HarnessMvtClient::gen_aptos_account(); + let hash_lock: [u8; 32] = keccak256("secret".to_string().as_bytes()).into(); + + eth_client_harness + .eth_client + .initiate_bridge_transfer( + BridgeAddress(EthAddress(signer_address)), + BridgeAddress(recipient), + HashLock(EthHash(hash_lock).0), + Amount(AssetType::EthAndWeth((1000, 0))), // Eth + ) + .await + .expect("Failed to initiate bridge transfer"); + + //TODO: Here call get details with the captured event +} + +#[tokio::test] +#[ignore] // To be tested after this is merged in https://github.com/movementlabsxyz/movement/pull/209 +async fn test_eth_client_should_successfully_complete_transfer() { + let config = Config::default(); + let (mut eth_client_harness, _config, _anvil) = TestHarness::new_only_eth(config).await; + + let signer_address: alloy::primitives::Address = eth_client_harness.signer_address(); + + let recipient = address!("70997970c51812dc3a010c7d01b50e0d17dc79c8"); + let recipient_bytes: Vec = recipient.to_string().as_bytes().to_vec(); + + let secret = "secret".to_string(); + let hash_lock = keccak256(secret.as_bytes()); + let hash_lock: [u8; 32] = hash_lock.into(); + + eth_client_harness + .eth_client + .initiate_bridge_transfer( + BridgeAddress(EthAddress(signer_address)), + BridgeAddress(recipient_bytes), + HashLock(EthHash(hash_lock).0), + Amount(AssetType::EthAndWeth((42, 0))), + ) + .await + .expect("Failed to initiate bridge transfer"); + + //TODO: Here call complete with the id captured from the event +} diff --git a/protocol-units/bridge/integration-tests/tests/client_l2move_l1move.rs b/protocol-units/bridge/integration-tests/tests/client_l2move_l1move.rs new file mode 100644 index 000000000..e2dccebc3 --- /dev/null +++ b/protocol-units/bridge/integration-tests/tests/client_l2move_l1move.rs @@ -0,0 +1,229 @@ +use anyhow::Result; +use bridge_config::Config; +use bridge_integration_tests::utils as test_utils; +use bridge_integration_tests::{MovementToEthCallArgs, TestHarnessFramework}; +use bridge_service::chains::movement::client_framework::MovementClientFramework; +use bridge_service::types::AssetType; +use bridge_service::{ + chains::{ + bridge_contracts::BridgeContract, + movement::utils::MovementHash, + }, + types::{BridgeTransferId, HashLockPreImage}, +}; +use chrono::Utc; +use tokio::time::{sleep, Duration}; +use tokio::{self}; +use tracing::info; + +#[tokio::test] +async fn test_movement_client_initiate_transfer() -> Result<(), anyhow::Error> { + let _ = tracing_subscriber::fmt().with_max_level(tracing::Level::DEBUG).try_init(); + MovementClientFramework::bridge_setup_scripts().await?; + let config: Config = Config::suzuka(); + let (mut mvt_client_harness, _config) = TestHarnessFramework::new_with_suzuka(config).await; + let args = MovementToEthCallArgs::default(); + + let test_result = async { + test_utils::fund_and_check_balance_framework(&mut mvt_client_harness, 100_000_000_000) + .await?; + test_utils::initiate_bridge_transfer_helper_framework( + &mut mvt_client_harness.movement_client, + args.initiator.0, + args.recipient.clone(), + args.hash_lock.0, + args.amount, + ) + .await + .expect("Failed to initiate bridge transfer"); + + let bridge_transfer_id: [u8; 32] = test_utils::extract_bridge_transfer_id_framework( + &mut mvt_client_harness.movement_client, + ) + .await?; + info!("Bridge transfer ID: {:?}", bridge_transfer_id); + + let details = BridgeContract::get_bridge_transfer_details_initiator( + &mut mvt_client_harness.movement_client, + BridgeTransferId(bridge_transfer_id), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + info!("Bridge transfer details: {:?}", details); + + assert_eq!(details.state, 1, "Bridge transfer should be initiated."); + + let amount = match details.amount.0 { + AssetType::Moveth(amount) => amount, + _ => panic!("Expected Moveth asset type but found something else"), + }; + + test_utils::assert_counterparty_bridge_transfer_details_framework( + &details, + details.initiator_address.to_string(), + details.recipient_address.to_vec(), + amount, + details.hash_lock.0, + details.time_lock.0, + ); + + Ok(()) + } + .await; + + test_result +} + +// Failing with EINVALID_PRE_IMAGE(0x1). Client and unit tests for modules used in client_movement_eth pass. +#[tokio::test] +async fn test_movement_client_complete_transfer() -> Result<(), anyhow::Error> { + let _ = tracing_subscriber::fmt().with_max_level(tracing::Level::DEBUG).try_init(); + MovementClientFramework::bridge_setup_scripts().await?; + let config: Config = Config::suzuka(); + let (mut mvt_client_harness, _config) = TestHarnessFramework::new_with_suzuka(config).await; + let args = MovementToEthCallArgs::default(); + let test_result = async { + test_utils::fund_and_check_balance_framework(&mut mvt_client_harness, 100_000_000_000) + .await?; + test_utils::initiate_bridge_transfer_helper_framework( + &mut mvt_client_harness.movement_client, + args.initiator.0, + args.recipient.clone(), + args.hash_lock.0, + args.amount, + ) + .await + .expect("Failed to initiate bridge transfer"); + + let bridge_transfer_id: [u8; 32] = test_utils::extract_bridge_transfer_id_framework( + &mut mvt_client_harness.movement_client, + ) + .await?; + info!("Bridge transfer ID: {:?}", bridge_transfer_id); + + let details = BridgeContract::get_bridge_transfer_details_initiator( + &mut mvt_client_harness.movement_client, + BridgeTransferId(bridge_transfer_id), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + info!("Bridge transfer details: {:?}", details); + + let secret = b"secret"; + let mut padded_secret = [0u8; 32]; + padded_secret[..secret.len()].copy_from_slice(secret); + + BridgeContract::initiator_complete_bridge_transfer( + &mut mvt_client_harness.movement_client, + BridgeTransferId(bridge_transfer_id), + HashLockPreImage(padded_secret), + ) + .await + .expect("Failed to complete bridge transfer"); + + let details = BridgeContract::get_bridge_transfer_details_initiator( + &mut mvt_client_harness.movement_client, + BridgeTransferId(bridge_transfer_id), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + info!("Bridge transfer details: {:?}", details); + + let amount = match details.amount.0 { + AssetType::Moveth(amount) => amount, + _ => panic!("Expected Moveth asset type but found something else"), + }; + test_utils::assert_counterparty_bridge_transfer_details_framework( + &details, + details.initiator_address.to_string(), + details.recipient_address.to_vec(), + amount, + details.hash_lock.0, + details.time_lock.0, + ); + + assert_eq!(details.state, 2, "Bridge transfer should be completed."); + + Ok(()) + } + .await; + + test_result +} + +#[tokio::test] +async fn test_movement_client_refund_transfer() -> Result<(), anyhow::Error> { + let _ = tracing_subscriber::fmt().with_max_level(tracing::Level::DEBUG).try_init(); + + MovementClientFramework::bridge_setup_scripts().await?; + + let config: Config = Config::suzuka(); + + let (mut mvt_client_harness, _config) = TestHarnessFramework::new_with_suzuka(config).await; + + let args = MovementToEthCallArgs::default(); + + let test_result = async { + test_utils::fund_and_check_balance_framework(&mut mvt_client_harness, 100_000_000_000) + .await?; + test_utils::initiate_bridge_transfer_helper_framework( + &mut mvt_client_harness.movement_client, + args.initiator.0, + args.recipient.clone(), + args.hash_lock.0, + args.amount, + ) + .await + .expect("Failed to initiate bridge transfer"); + + let bridge_transfer_id: [u8; 32] = test_utils::extract_bridge_transfer_id_framework( + &mut mvt_client_harness.movement_client, + ) + .await?; + info!("Bridge transfer ID: {:?}", bridge_transfer_id); + + let details = BridgeContract::get_bridge_transfer_details_initiator( + &mut mvt_client_harness.movement_client, + BridgeTransferId(MovementHash(bridge_transfer_id).0), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + info!("Time lock: {:?}", details.time_lock); + + sleep(Duration::from_secs(20)).await; + + info!("Current timestamp: {:?}", Utc::now().timestamp()); + + BridgeContract::refund_bridge_transfer( + &mut mvt_client_harness.movement_client, + BridgeTransferId(MovementHash(bridge_transfer_id).0), + ) + .await + .expect("Failed to refund bridge transfer"); + + let details = BridgeContract::get_bridge_transfer_details_initiator( + &mut mvt_client_harness.movement_client, + BridgeTransferId(MovementHash(bridge_transfer_id).0), + ) + .await + .expect("Failed to get bridge transfer details") + .expect("Expected to find bridge transfer details, but got None"); + + assert_eq!(details.state, 3, "Bridge transfer should be refunded."); + + Ok(()) + } + .await; + + test_result +} + + diff --git a/protocol-units/bridge/move-modules/scripts/enable_bridge_feature.move b/protocol-units/bridge/move-modules/scripts/enable_bridge_feature.move new file mode 100644 index 000000000..03651297a --- /dev/null +++ b/protocol-units/bridge/move-modules/scripts/enable_bridge_feature.move @@ -0,0 +1,21 @@ +script { + use aptos_framework::aptos_governance; + use std::features; + + fun enable_bridge_feature(core_resources: &signer) { + let framework_signer = aptos_governance::get_signer_testnet_only(core_resources, @0x1); + + let enabled_blob: vector = vector[ + features::get_atomic_bridge_feature() + ]; + + let disabled_blob: vector = vector[]; + + features::change_feature_flags_for_next_epoch( + &framework_signer, + enabled_blob, + disabled_blob + ); + features::on_new_epoch(&framework_signer); + } +} \ No newline at end of file diff --git a/protocol-units/bridge/move-modules/scripts/set_counterparty_time_lock_duration.move b/protocol-units/bridge/move-modules/scripts/set_counterparty_time_lock_duration.move new file mode 100644 index 000000000..84bbecc64 --- /dev/null +++ b/protocol-units/bridge/move-modules/scripts/set_counterparty_time_lock_duration.move @@ -0,0 +1,9 @@ +script { + use aptos_framework::aptos_governance; + use aptos_framework::atomic_bridge_configuration; + + fun set_counterparty_time_lock_duration(core_resources: &signer, new_timelock: u64) { + let framework_signer = aptos_governance::get_signer_testnet_only(core_resources, @aptos_framework); + atomic_bridge_configuration::set_counterparty_time_lock_duration(&framework_signer, new_timelock); + } +} \ No newline at end of file diff --git a/protocol-units/bridge/move-modules/scripts/set_initiator_time_lock_duration.move b/protocol-units/bridge/move-modules/scripts/set_initiator_time_lock_duration.move new file mode 100644 index 000000000..54bc0d20e --- /dev/null +++ b/protocol-units/bridge/move-modules/scripts/set_initiator_time_lock_duration.move @@ -0,0 +1,9 @@ +script { + use aptos_framework::aptos_governance; + use aptos_framework::atomic_bridge_configuration; + + fun set_initiator_time_lock_duration(core_resources: &signer, new_timelock: u64) { + let framework_signer = aptos_governance::get_signer_testnet_only(core_resources, @aptos_framework); + atomic_bridge_configuration::set_initiator_time_lock_duration(&framework_signer, new_timelock); + } +} \ No newline at end of file diff --git a/protocol-units/bridge/move-modules/scripts/store_mint_burn_caps.move b/protocol-units/bridge/move-modules/scripts/store_mint_burn_caps.move new file mode 100644 index 000000000..571beee5a --- /dev/null +++ b/protocol-units/bridge/move-modules/scripts/store_mint_burn_caps.move @@ -0,0 +1,13 @@ +script { + use aptos_framework::aptos_governance; + use aptos_framework::transaction_fee; + use aptos_framework::atomic_bridge; + + fun store_mint_burn_caps(core_resources: &signer) { + let framework_signer = aptos_governance::get_signer_testnet_only(core_resources, @aptos_framework); + let (mint, burn) = transaction_fee::copy_capabilities_for_bridge(&framework_signer); + + atomic_bridge::store_aptos_coin_mint_cap(&framework_signer, mint); + atomic_bridge::store_aptos_coin_burn_cap(&framework_signer, burn); + } +} \ No newline at end of file diff --git a/protocol-units/bridge/move-modules/scripts/update_bridge_operator.move b/protocol-units/bridge/move-modules/scripts/update_bridge_operator.move new file mode 100644 index 000000000..964bd62b4 --- /dev/null +++ b/protocol-units/bridge/move-modules/scripts/update_bridge_operator.move @@ -0,0 +1,11 @@ +script { + use aptos_framework::aptos_account; + use aptos_framework::aptos_governance; + use aptos_framework::atomic_bridge_configuration; + + fun update_bridge_operator(core_resources: &signer, new_operator: address) { + let framework_signer = aptos_governance::get_signer_testnet_only(core_resources, @aptos_framework); + atomic_bridge_configuration::update_bridge_operator(&framework_signer, new_operator); + aptos_account::create_account(@0x00000000000000000000000000face); + } +} \ No newline at end of file diff --git a/protocol-units/bridge/service/src/chains/bridge_contracts.rs b/protocol-units/bridge/service/src/chains/bridge_contracts.rs index 49707dab6..25b578e42 100644 --- a/protocol-units/bridge/service/src/chains/bridge_contracts.rs +++ b/protocol-units/bridge/service/src/chains/bridge_contracts.rs @@ -1,4 +1,4 @@ -use crate::types::LockDetails; +use crate::types::{BridgeTransferDetailsCounterparty, LockDetails}; use std::fmt; use thiserror::Error; use tokio_stream::Stream; @@ -173,7 +173,7 @@ pub trait BridgeContract: Clone + Unpin + Send + Sync { async fn get_bridge_transfer_details_counterparty( &mut self, bridge_transfer_id: BridgeTransferId, - ) -> BridgeContractResult>>; + ) -> BridgeContractResult>>; async fn lock_bridge_transfer( &mut self, diff --git a/protocol-units/bridge/service/src/chains/ethereum/client.rs b/protocol-units/bridge/service/src/chains/ethereum/client.rs index ed146cc2f..5d1a52b12 100644 --- a/protocol-units/bridge/service/src/chains/ethereum/client.rs +++ b/protocol-units/bridge/service/src/chains/ethereum/client.rs @@ -6,8 +6,7 @@ use super::utils::{calculate_storage_slot, send_transaction, send_transaction_ru use crate::chains::bridge_contracts::BridgeContractError; use crate::chains::bridge_contracts::BridgeContractResult; use crate::types::{ - Amount, AssetType, BridgeAddress, BridgeTransferDetails, BridgeTransferId, HashLock, - HashLockPreImage, TimeLock, + Amount, AssetType, BridgeAddress, BridgeTransferDetails, BridgeTransferDetailsCounterparty, BridgeTransferId, HashLock, HashLockPreImage, TimeLock }; use alloy::primitives::{Address, FixedBytes, U256}; use alloy::providers::{Provider, ProviderBuilder}; @@ -18,6 +17,7 @@ use alloy::{ }; use alloy_rlp::Decodable; use bridge_config::common::eth::EthConfig; +use tracing::info; use std::fmt::{self, Debug}; use url::Url; @@ -68,6 +68,16 @@ struct EthBridgeTransferDetails { pub state: u8, } +#[derive(RlpDecodable, RlpEncodable)] +struct EthBridgeTransferDetailsCounterparty { + pub amount: U256, + pub originator:[u8; 32], + pub recipient: EthAddress, + pub hash_lock: [u8; 32], + pub time_lock: U256, + pub state: u8, +} + // We need to be able to build the client and deploy the contracts // therfore the `initiator_contract` and `counterparty_contract` // should be optional, as their values will be unknown at the time of building the client. @@ -256,7 +266,7 @@ impl crate::chains::bridge_contracts::BridgeContract for EthClient { .ok_or(generic_error("Could not get required slice from pre-image"))? .try_into() .map_err(|_| generic_error("Could not convert pre-image to [u8; 32]"))?; - + info!{"Pre-image: {:?}", pre_image}; let contract = AtomicBridgeInitiator::new(self.initiator_contract_address(), &self.rpc_provider); let call = contract @@ -414,7 +424,7 @@ impl crate::chains::bridge_contracts::BridgeContract for EthClient { async fn get_bridge_transfer_details_counterparty( &mut self, bridge_transfer_id: BridgeTransferId, - ) -> BridgeContractResult>> { + ) -> BridgeContractResult>> { let generic_error = |desc| BridgeContractError::GenericError(String::from(desc)); let mapping_slot = U256::from(0); // the mapping is the zeroth slot in the contract @@ -429,13 +439,13 @@ impl crate::chains::bridge_contracts::BridgeContract for EthClient { println!("storage_bytes: {:?}", storage_bytes); let mut storage_slice = &storage_bytes[..]; - let eth_details = EthBridgeTransferDetails::decode(&mut storage_slice) + let eth_details = EthBridgeTransferDetailsCounterparty::decode(&mut storage_slice) .map_err(|_| generic_error("could not decode storage"))?; - Ok(Some(BridgeTransferDetails { + Ok(Some(BridgeTransferDetailsCounterparty { bridge_transfer_id, - initiator_address: BridgeAddress(eth_details.originator), - recipient_address: BridgeAddress(eth_details.recipient.to_vec()), + initiator_address: BridgeAddress(eth_details.originator.to_vec()), + recipient_address: BridgeAddress(eth_details.recipient), hash_lock: HashLock(eth_details.hash_lock), //@TODO unit test these wrapping to check for any nasty side effects. time_lock: TimeLock(eth_details.time_lock.wrapping_to::()), diff --git a/protocol-units/bridge/service/src/chains/movement/client.rs b/protocol-units/bridge/service/src/chains/movement/client.rs index 2a15c9f9f..14f49c8b6 100644 --- a/protocol-units/bridge/service/src/chains/movement/client.rs +++ b/protocol-units/bridge/service/src/chains/movement/client.rs @@ -2,6 +2,7 @@ use super::utils::{self, MovementAddress}; use crate::chains::bridge_contracts::BridgeContract; use crate::chains::bridge_contracts::BridgeContractError; use crate::chains::bridge_contracts::BridgeContractResult; +use crate::types::BridgeTransferDetailsCounterparty; use crate::types::{ Amount, AssetType, BridgeAddress, BridgeTransferDetails, BridgeTransferId, HashLock, HashLockPreImage, TimeLock, @@ -54,7 +55,7 @@ impl MovementClient { let rest_client = Client::new(node_connection_url.clone()); let signer = - utils::create_local_account(config.movement_signer_address.clone(), &rest_client) + utils::create_local_account(config.movement_signer_key.clone(), &rest_client) .await?; let native_address = AccountAddress::from_hex_literal(&config.movement_native_address)?; Ok(MovementClient { @@ -397,7 +398,7 @@ impl BridgeContract for MovementClient { async fn get_bridge_transfer_details_counterparty( &mut self, bridge_transfer_id: BridgeTransferId, - ) -> BridgeContractResult>> { + ) -> BridgeContractResult>> { let bridge_transfer_id_hex = format!("0x{}", hex::encode(bridge_transfer_id.0)); let view_request = ViewRequest { @@ -442,20 +443,19 @@ impl BridgeContract for MovementClient { .parse::() .map_err(|_| BridgeContractError::SerializationError)?; let state = utils::val_as_u64_initiator(values.get(5))? as u8; - - let originator_address = AccountAddress::from_hex_literal(originator) + let originator_address_bytes = + hex::decode(&originator[2..]).map_err(|_| BridgeContractError::SerializationError)?; + let recipient_address = AccountAddress::from_hex_literal(recipient) .map_err(|_| BridgeContractError::SerializationError)?; - let recipient_address_bytes = - hex::decode(&recipient[2..]).map_err(|_| BridgeContractError::SerializationError)?; - let hash_lock_array: [u8; 32] = hex::decode(&hash_lock[2..]) + let hash_lock_array: [u8; 32] = hex::decode(&hash_lock[2..]) .map_err(|_| BridgeContractError::SerializationError)? .try_into() .map_err(|_| BridgeContractError::SerializationError)?; - let details = BridgeTransferDetails { + let details = BridgeTransferDetailsCounterparty { bridge_transfer_id, - initiator_address: BridgeAddress(MovementAddress(originator_address)), - recipient_address: BridgeAddress(recipient_address_bytes), + initiator_address: BridgeAddress(originator_address_bytes), + recipient_address: BridgeAddress(MovementAddress(recipient_address)), amount: Amount(AssetType::Moveth(amount)), hash_lock: HashLock(hash_lock_array), time_lock: TimeLock(time_lock), @@ -466,12 +466,8 @@ impl BridgeContract for MovementClient { } } -use std::{ - env, fs, - io::Write, - path::PathBuf, - process::{Command, Stdio}, -}; +use std::process::Stdio; + use tokio::{ io::{AsyncBufReadExt, BufReader}, process::Command as TokioCommand, @@ -480,227 +476,6 @@ use tokio::{ }; impl MovementClient { - pub fn publish_for_test(&mut self) -> Result<()> { - let random_seed = rand::thread_rng().gen_range(0, 1000000).to_string(); - - let mut process = Command::new("movement") - .args(&["init"]) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .expect("Failed to execute command"); - - let private_key_hex = hex::encode(self.signer.private_key().to_bytes()); - - let stdin: &mut std::process::ChildStdin = - process.stdin.as_mut().expect("Failed to open stdin"); - - let movement_dir = PathBuf::from(".movement"); - - if movement_dir.exists() { - stdin.write_all(b"yes\n").expect("Failed to write to stdin"); - } - - stdin.write_all(b"local\n").expect("Failed to write to stdin"); - - let _ = stdin.write_all(format!("{}\n", private_key_hex).as_bytes()); - - let addr_output = process.wait_with_output().expect("Failed to read command output"); - - if !addr_output.stdout.is_empty() { - println!("stdout: {}", String::from_utf8_lossy(&addr_output.stdout)); - } - - if !addr_output.stderr.is_empty() { - eprintln!("stderr: {}", String::from_utf8_lossy(&addr_output.stderr)); - } - let addr_output_str = String::from_utf8_lossy(&addr_output.stderr); - let address = addr_output_str - .split_whitespace() - .find(|word| word.starts_with("0x")) - .expect("Failed to extract the Movement account address"); - - println!("Extracted address: {}", address); - - let resource_output = Command::new("movement") - .args(&[ - "account", - "derive-resource-account-address", - "--address", - address, - "--seed", - &random_seed, - ]) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .output() - .expect("Failed to execute command"); - - // Print the output of the resource address command for debugging - if !resource_output.stdout.is_empty() { - println!("stdout: {}", String::from_utf8_lossy(&resource_output.stdout)); - } - if !resource_output.stderr.is_empty() { - eprintln!("stderr: {}", String::from_utf8_lossy(&resource_output.stderr)); - } - - // Extract the resource address from the JSON output - let resource_output_str = String::from_utf8_lossy(&resource_output.stdout); - let resource_address = resource_output_str - .lines() - .find(|line| line.contains("\"Result\"")) - .and_then(|line| line.split('"').nth(3)) - .expect("Failed to extract the resource account address"); - - // Ensure the address has a "0x" prefix - let formatted_resource_address = if resource_address.starts_with("0x") { - resource_address.to_string() - } else { - format!("0x{}", resource_address) - }; - - // Set counterparty module address to resource address, for function calls: - self.native_address = AccountAddress::from_hex_literal(&formatted_resource_address)?; - - println!("Derived resource address: {}", formatted_resource_address); - - let current_dir = env::current_dir().expect("Failed to get current directory"); - println!("Current directory: {:?}", current_dir); - - let move_toml_path = PathBuf::from("../move-modules/Move.toml"); - - // Read the existing content of Move.toml - let move_toml_content = - fs::read_to_string(&move_toml_path).expect("Failed to read Move.toml file"); - - // Update the content of Move.toml with the new addresses - let updated_content = move_toml_content - .lines() - .map(|line| match line { - _ if line.starts_with("resource_addr = ") => { - format!(r#"resource_addr = "{}""#, formatted_resource_address) - } - _ if line.starts_with("atomic_bridge = ") => { - format!(r#"atomic_bridge = "{}""#, formatted_resource_address) - } - _ if line.starts_with("moveth = ") => { - format!(r#"moveth = "{}""#, formatted_resource_address) - } - _ if line.starts_with("master_minter = ") => { - format!(r#"master_minter = "{}""#, formatted_resource_address) - } - _ if line.starts_with("minter = ") => { - format!(r#"minter = "{}""#, formatted_resource_address) - } - _ if line.starts_with("admin = ") => { - format!(r#"admin = "{}""#, formatted_resource_address) - } - _ if line.starts_with("origin_addr = ") => { - format!(r#"origin_addr = "{}""#, address) - } - _ if line.starts_with("source_account = ") => { - format!(r#"source_account = "{}""#, address) - } - _ => line.to_string(), - }) - .collect::>() - .join("\n"); - - // Write the updated content back to Move.toml - let mut file = - fs::File::create(&move_toml_path).expect("Failed to open Move.toml file for writing"); - file.write_all(updated_content.as_bytes()) - .expect("Failed to write updated Move.toml file"); - - println!("Move.toml updated successfully."); - - let output2 = Command::new("movement") - .args(&[ - "move", - "create-resource-account-and-publish-package", - "--assume-yes", - "--address-name", - "moveth", - "--seed", - &random_seed, - "--package-dir", - "../move-modules", - ]) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .output() - .expect("Failed to execute command"); - - if !output2.stdout.is_empty() { - eprintln!("stdout: {}", String::from_utf8_lossy(&output2.stdout)); - } - - if !output2.stderr.is_empty() { - eprintln!("stderr: {}", String::from_utf8_lossy(&output2.stderr)); - } - - if movement_dir.exists() { - fs::remove_dir_all(movement_dir).expect("Failed to delete .movement directory"); - println!(".movement directory deleted successfully."); - } - - // Read the existing content of Move.toml - let move_toml_content = - fs::read_to_string(&move_toml_path).expect("Failed to read Move.toml file"); - - // Directly assign the address - let final_address = "0xcafe"; - - // Directly assign the formatted resource address - let final_formatted_resource_address = - "0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5"; - - let updated_content = move_toml_content - .lines() - .map(|line| match line { - _ if line.starts_with("resource_addr = ") => { - format!(r#"resource_addr = "{}""#, final_formatted_resource_address) - } - _ if line.starts_with("atomic_bridge = ") => { - format!(r#"atomic_bridge = "{}""#, final_formatted_resource_address) - } - _ if line.starts_with("moveth = ") => { - format!(r#"moveth = "{}""#, final_formatted_resource_address) - } - _ if line.starts_with("master_minter = ") => { - format!(r#"master_minter = "{}""#, final_formatted_resource_address) - } - _ if line.starts_with("minter = ") => { - format!(r#"minter = "{}""#, final_formatted_resource_address) - } - _ if line.starts_with("admin = ") => { - format!(r#"admin = "{}""#, final_formatted_resource_address) - } - _ if line.starts_with("origin_addr = ") => { - format!(r#"origin_addr = "{}""#, final_address) - } - _ if line.starts_with("pauser = ") => { - format!(r#"pauser = "{}""#, "0xdafe") - } - _ if line.starts_with("denylister = ") => { - format!(r#"denylister = "{}""#, "0xcade") - } - _ => line.to_string(), - }) - .collect::>() - .join("\n"); - - // Write the updated content back to Move.toml - let mut file = - fs::File::create(&move_toml_path).expect("Failed to open Move.toml file for writing"); - file.write_all(updated_content.as_bytes()) - .expect("Failed to write updated Move.toml file"); - - println!("Move.toml addresses updated successfully at the end of the test."); - - Ok(()) - } pub async fn new_for_test() -> Result<(Self, tokio::process::Child), anyhow::Error> { let kill_cmd = TokioCommand::new("sh") diff --git a/protocol-units/bridge/service/src/chains/movement/client_framework.rs b/protocol-units/bridge/service/src/chains/movement/client_framework.rs new file mode 100644 index 000000000..0b983e55b --- /dev/null +++ b/protocol-units/bridge/service/src/chains/movement/client_framework.rs @@ -0,0 +1,975 @@ +use super::utils::{self, MovementAddress}; +use crate::chains::bridge_contracts::BridgeContract; +use crate::chains::bridge_contracts::BridgeContractError; +use crate::chains::bridge_contracts::BridgeContractResult; +use crate::types::BridgeTransferDetailsCounterparty; +use crate::types::{ + Amount, AssetType, BridgeAddress, BridgeTransferDetails, BridgeTransferId, HashLock, + HashLockPreImage, TimeLock, +}; +use anyhow::{Context, Result}; +use aptos_api_types::{EntryFunctionId, MoveModuleId, ViewRequest}; +use aptos_sdk::{ + move_types::identifier::Identifier, + rest_client::{Client, Response}, + types::LocalAccount, +}; +use aptos_types::account_address::AccountAddress; +use bridge_config::common::movement::MovementConfig; +use rand::prelude::*; +use std::path::Path; +use std::str::FromStr; +use std::sync::Arc; +use tracing::{debug, info}; +use url::Url; + +const FRAMEWORK_ADDRESS: AccountAddress = AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, +]); +const INITIATOR_MODULE_NAME: &str = "atomic_bridge_initiator"; +const COUNTERPARTY_MODULE_NAME: &str = "atomic_bridge_counterparty"; +const DUMMY_ADDRESS: AccountAddress = AccountAddress::new([0; 32]); + +#[allow(dead_code)] +enum Call { + Lock, + Complete, + Abort, + GetDetails, +} + +#[allow(dead_code)] +#[derive(Clone)] +pub struct MovementClientFramework { + ///Native Address of the + pub native_address: AccountAddress, + /// Bytes of the non-native (external) chain. + pub non_native_address: Vec, + ///The Apotos Rest Client + pub rest_client: Client, + ///The signer account + signer: Arc, +} + +impl MovementClientFramework { + pub async fn new(config: &MovementConfig) -> Result { + let node_connection_url = Url::from_str(config.mvt_rpc_connection_url().as_str()) + .map_err(|_| BridgeContractError::SerializationError)?; + + let rest_client = Client::new(node_connection_url.clone()); + + let signer = + utils::create_local_account(config.movement_signer_key.clone(), &rest_client).await?; + let native_address = AccountAddress::from_hex_literal(&config.movement_native_address)?; + Ok(MovementClientFramework { + native_address, + non_native_address: Vec::new(), //dummy for now + rest_client, + signer: Arc::new(signer), + }) + } + + pub fn rest_client(&self) -> &Client { + &self.rest_client + } + + pub fn signer(&self) -> &LocalAccount { + &self.signer + } + + pub async fn initiator_set_timelock( + &mut self, + time_lock: u64, + ) -> Result<(), BridgeContractError> { + let args = vec![utils::serialize_u64(&time_lock)?]; + + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + "atomic_bridge_configuration", + "set_initiator_time_lock_duration", + Vec::new(), + args, + ); + + utils::send_and_confirm_aptos_transaction(&self.rest_client, self.signer.as_ref(), payload) + .await + .map_err(|_| BridgeContractError::CallError)?; + + Ok(()) + } + + pub async fn counterparty_set_timelock( + &mut self, + time_lock: u64, + ) -> Result<(), BridgeContractError> { + let args = vec![utils::serialize_u64(&time_lock)?]; + + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + "atomic_bridge_configuration", + "set_counterparty_time_lock_duration", + Vec::new(), + args, + ); + + utils::send_and_confirm_aptos_transaction(&self.rest_client, self.signer.as_ref(), payload) + .await + .map_err(|_| BridgeContractError::CallError)?; + + Ok(()) + } +} + +#[async_trait::async_trait] +impl BridgeContract for MovementClientFramework { + async fn initiate_bridge_transfer( + &mut self, + _initiator: BridgeAddress, + recipient: BridgeAddress>, + hash_lock: HashLock, + amount: Amount, + ) -> BridgeContractResult<()> { + let amount_value = match amount.0 { + AssetType::Moveth(value) => value, + _ => return Err(BridgeContractError::ConversionFailed("Amount".to_string())), + }; + debug!("Amount value: {:?}", amount_value); + + let args = vec![ + utils::serialize_vec_initiator(&recipient.0)?, + utils::serialize_vec_initiator(&hash_lock.0[..])?, + utils::serialize_u64_initiator(&amount_value)?, + ]; + + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + "atomic_bridge_initiator", + "initiate_bridge_transfer", + Vec::new(), + args, + ); + + let _ = utils::send_and_confirm_aptos_transaction( + &self.rest_client, + self.signer.as_ref(), + payload, + ) + .await + .map_err(|_| BridgeContractError::InitiateTransferError)?; + + Ok(()) + } + + async fn initiator_complete_bridge_transfer( + &mut self, + bridge_transfer_id: BridgeTransferId, + preimage: HashLockPreImage, + ) -> BridgeContractResult<()> { + let unpadded_preimage = { + let mut end = preimage.0.len(); + while end > 0 && preimage.0[end - 1] == 0 { + end -= 1; + } + &preimage.0[..end] + }; + println!("Unpadded preimage: {:?}", unpadded_preimage); + let args2 = vec![ + utils::serialize_vec_initiator(&bridge_transfer_id.0[..])?, + utils::serialize_vec_initiator(unpadded_preimage)?, + ]; + + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + INITIATOR_MODULE_NAME, + "complete_bridge_transfer", + Vec::new(), + args2, + ); + + let _ = utils::send_and_confirm_aptos_transaction( + &self.rest_client, + self.signer.as_ref(), + payload, + ) + .await + .map_err(|_| BridgeContractError::CompleteTransferError); + + Ok(()) + } + + async fn counterparty_complete_bridge_transfer( + &mut self, + bridge_transfer_id: BridgeTransferId, + preimage: HashLockPreImage, + ) -> BridgeContractResult<()> { + let unpadded_preimage = { + let mut end = preimage.0.len(); + while end > 0 && preimage.0[end - 1] == 0 { + end -= 1; + } + &preimage.0[..end] + }; + let args2 = vec![ + utils::serialize_vec(&bridge_transfer_id.0[..])?, + utils::serialize_vec(&unpadded_preimage)?, + ]; + + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + COUNTERPARTY_MODULE_NAME, + "complete_bridge_transfer", + Vec::new(), + args2, + ); + + let result = utils::send_and_confirm_aptos_transaction( + &self.rest_client, + self.signer.as_ref(), + payload, + ) + .await + .map_err(|_| BridgeContractError::CompleteTransferError); + + match &result { + Ok(tx_result) => { + debug!("Transaction succeeded: {:?}", tx_result); + } + Err(err) => { + debug!("Transaction failed: {:?}", err); + } + } + + Ok(()) + } + + async fn lock_bridge_transfer( + &mut self, + bridge_transfer_id: BridgeTransferId, + hash_lock: HashLock, + initiator: BridgeAddress>, + recipient: BridgeAddress, + amount: Amount, + ) -> BridgeContractResult<()> { + let amount_value = match amount.0 { + AssetType::Moveth(value) => value, + _ => return Err(BridgeContractError::SerializationError), + }; + + let args = vec![ + utils::serialize_vec(&initiator.0)?, + utils::serialize_vec(&bridge_transfer_id.0[..])?, + utils::serialize_vec(&hash_lock.0[..])?, + utils::serialize_vec(&recipient.0)?, + utils::serialize_u64(&amount_value)?, + ]; + + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + COUNTERPARTY_MODULE_NAME, + "lock_bridge_transfer_assets", + Vec::new(), + args, + ); + + let _ = utils::send_and_confirm_aptos_transaction( + &self.rest_client, + self.signer.as_ref(), + payload, + ) + .await + .map_err(|_| BridgeContractError::LockTransferError); + + Ok(()) + } + + async fn refund_bridge_transfer( + &mut self, + bridge_transfer_id: BridgeTransferId, + ) -> BridgeContractResult<()> { + let args = vec![utils::serialize_vec_initiator(&bridge_transfer_id.0[..])?]; + + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + "atomic_bridge_initiator", + "refund_bridge_transfer", + Vec::new(), + args, + ); + + utils::send_and_confirm_aptos_transaction(&self.rest_client, self.signer.as_ref(), payload) + .await + .map_err(|err| BridgeContractError::OnChainError(err.to_string()))?; + + Ok(()) + } + + async fn abort_bridge_transfer( + &mut self, + bridge_transfer_id: BridgeTransferId, + ) -> BridgeContractResult<()> { + let args3 = vec![utils::serialize_vec(&bridge_transfer_id.0[..])?]; + let payload = utils::make_aptos_payload( + FRAMEWORK_ADDRESS, + COUNTERPARTY_MODULE_NAME, + "abort_bridge_transfer", + Vec::new(), + args3, + ); + let result = utils::send_and_confirm_aptos_transaction( + &self.rest_client, + self.signer.as_ref(), + payload, + ) + .await + .map_err(|_| BridgeContractError::AbortTransferError); + + info!("Abort bridge transfer result: {:?}", &result); + + Ok(()) + } + + async fn get_bridge_transfer_details_initiator( + &mut self, + bridge_transfer_id: BridgeTransferId, + ) -> BridgeContractResult>> { + let bridge_transfer_id_hex = format!("0x{}", hex::encode(bridge_transfer_id.0)); + + let view_request = ViewRequest { + function: EntryFunctionId { + module: MoveModuleId { + address: FRAMEWORK_ADDRESS.clone().into(), + name: aptos_api_types::IdentifierWrapper( + Identifier::new("atomic_bridge_store") + .map_err(|_| BridgeContractError::FunctionViewError)?, + ), + }, + name: aptos_api_types::IdentifierWrapper( + Identifier::new("get_bridge_transfer_details_initiator") + .map_err(|_| BridgeContractError::FunctionViewError)?, + ), + }, + type_arguments: vec![], + arguments: vec![serde_json::json!(bridge_transfer_id_hex)], + }; + + let response: Response> = self + .rest_client + .view(&view_request, None) + .await + .map_err(|_| BridgeContractError::CallError)?; + + let values = response.inner(); + + if values.len() != 1 { + return Err(BridgeContractError::InvalidResponseLength); + } + + let value = &values[0]; + + let originator_address = AccountAddress::from_hex_literal( + value["addresses"]["initiator"].as_str().ok_or(BridgeContractError::SerializationError)? + ).map_err(|_| BridgeContractError::SerializationError)?; + + let recipient_address_bytes = hex::decode( + &value["addresses"]["recipient"]["inner"].as_str().ok_or(BridgeContractError::SerializationError)?[2..] + ).map_err(|_| BridgeContractError::SerializationError)?; + + let amount = value["amount"] + .as_str() + .ok_or(BridgeContractError::SerializationError)? + .parse::() + .map_err(|_| BridgeContractError::SerializationError)?; + + let hash_lock_array: [u8; 32] = hex::decode( + &value["hash_lock"].as_str().ok_or(BridgeContractError::SerializationError)?[2..] + ).map_err(|_| BridgeContractError::SerializationError)?.try_into() + .map_err(|_| BridgeContractError::SerializationError)?; + + let time_lock = value["time_lock"] + .as_str() + .ok_or(BridgeContractError::SerializationError)? + .parse::() + .map_err(|_| BridgeContractError::SerializationError)?; + + let state = value["state"] + .as_u64() + .ok_or(BridgeContractError::SerializationError)? as u8; + + let details = BridgeTransferDetails { + bridge_transfer_id, + initiator_address: BridgeAddress(MovementAddress(originator_address)), + recipient_address: BridgeAddress(recipient_address_bytes), + amount: Amount(AssetType::Moveth(amount)), + hash_lock: HashLock(hash_lock_array), + time_lock: TimeLock(time_lock), + state, + }; + + Ok(Some(details)) + } + + async fn get_bridge_transfer_details_counterparty( + &mut self, + bridge_transfer_id: BridgeTransferId, + ) -> BridgeContractResult>> { + let bridge_transfer_id_hex = format!("0x{}", hex::encode(bridge_transfer_id.0)); + + let view_request = ViewRequest { + function: EntryFunctionId { + module: MoveModuleId { + address: FRAMEWORK_ADDRESS.clone().into(), + name: aptos_api_types::IdentifierWrapper( + Identifier::new("atomic_bridge_store") + .map_err(|_| BridgeContractError::FunctionViewError)?, + ), + }, + name: aptos_api_types::IdentifierWrapper( + Identifier::new("get_bridge_transfer_details_counterparty") + .map_err(|_| BridgeContractError::FunctionViewError)?, + ), + }, + type_arguments: vec![], + arguments: vec![serde_json::json!(bridge_transfer_id_hex)], + }; + + let response: Response> = self + .rest_client + .view(&view_request, None) + .await + .map_err(|_| BridgeContractError::CallError)?; + + let values = response.inner(); + + if values.len() != 1 { + return Err(BridgeContractError::InvalidResponseLength); + } + + let value = &values[0]; + + let originator_address_bytes = hex::decode( + &value["addresses"]["initiator"]["inner"] + .as_str() + .ok_or(BridgeContractError::SerializationError)?[2..], + ) + .map_err(|_| BridgeContractError::SerializationError)?; + + let recipient_address = AccountAddress::from_hex_literal( + value["addresses"]["recipient"].as_str().ok_or(BridgeContractError::SerializationError)?, + ) + .map_err(|_| BridgeContractError::SerializationError)?; + + let amount = value["amount"] + .as_str() + .ok_or(BridgeContractError::SerializationError)? + .parse::() + .map_err(|_| BridgeContractError::SerializationError)?; + + let hash_lock_array: [u8; 32] = hex::decode( + &value["hash_lock"] + .as_str() + .ok_or(BridgeContractError::SerializationError)?[2..], + ) + .map_err(|_| BridgeContractError::SerializationError)? + .try_into() + .map_err(|_| BridgeContractError::SerializationError)?; + + let time_lock = value["time_lock"] + .as_str() + .ok_or(BridgeContractError::SerializationError)? + .parse::() + .map_err(|_| BridgeContractError::SerializationError)?; + + let state = value["state"] + .as_u64() + .ok_or(BridgeContractError::SerializationError)? as u8; + + let details = BridgeTransferDetailsCounterparty { + bridge_transfer_id, + initiator_address: BridgeAddress(originator_address_bytes), + recipient_address: BridgeAddress(MovementAddress(recipient_address)), + amount: Amount(AssetType::Moveth(amount)), + hash_lock: HashLock(hash_lock_array), + time_lock: TimeLock(time_lock), + state, + }; + + Ok(Some(details)) + } +} + +use std::{ + env, fs, + io::Write, + path::PathBuf, + process::{Command, Stdio}, +}; +use tokio::{ + io::{AsyncBufReadExt, BufReader}, + process::Command as TokioCommand, + sync::oneshot, + task, +}; + +impl MovementClientFramework { + pub async fn bridge_setup_scripts() -> Result<()> { + let current_dir = env::current_dir().expect("Failed to get current directory"); + println!("Current directory: {:?}", current_dir); + let project_root = Path::new("../../../"); + env::set_current_dir(&project_root) + .context("Failed to change directory to project root")?; + + let compile_output = Command::new("movement") + .args(&[ + "move", + "compile", + "--package-dir", + "protocol-units/bridge/move-modules/" + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output()?; + + if !compile_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&compile_output.stdout)); + } + if !compile_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&compile_output.stderr)); + } + + let enable_bridge_feature_output = Command::new("movement") + .args(&[ + "move", + "run-script", + "--compiled-script-path", + "protocol-units/bridge/move-modules/build/bridge-modules/bytecode_scripts/enable_bridge_feature.mv", + "--profile", + "default", + "--assume-yes", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output()?; + + if !enable_bridge_feature_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&enable_bridge_feature_output.stdout)); + } + if !enable_bridge_feature_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&enable_bridge_feature_output.stderr)); + } + + let store_mint_burn_caps_output = Command::new("movement") + .args(&[ + "move", + "run-script", + "--compiled-script-path", + "protocol-units/bridge/move-modules/build/bridge-modules/bytecode_scripts/store_mint_burn_caps.mv", + "--profile", + "default", + "--assume-yes", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output()?; + + if !store_mint_burn_caps_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&store_mint_burn_caps_output.stdout)); + } + if !store_mint_burn_caps_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&store_mint_burn_caps_output.stderr)); + } + + let update_bridge_operator_output = Command::new("movement") + .args(&[ + "move", + "run-script", + "--compiled-script-path", + "protocol-units/bridge/move-modules/build/bridge-modules/bytecode_scripts/update_bridge_operator.mv", + "--args", + "address:0xf90391c81027f03cdea491ed8b36ffaced26b6df208a9b569e5baf2590eb9b16", + "--profile", + "default", + "--assume-yes", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output()?; + + if !update_bridge_operator_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&update_bridge_operator_output.stdout)); + } + if !update_bridge_operator_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&update_bridge_operator_output.stderr)); + } + + let set_initiator_time_lock_script_output = Command::new("movement") + .args(&[ + "move", + "run-script", + "--compiled-script-path", + "protocol-units/bridge/move-modules/build/bridge-modules/bytecode_scripts/set_initiator_time_lock_duration.mv", + "--args", + "u64: 11", + "--profile", + "default", + "--assume-yes", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output()?; + + if !set_initiator_time_lock_script_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&update_bridge_operator_output.stdout)); + } + if !set_initiator_time_lock_script_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&update_bridge_operator_output.stderr)); + } + + let set_counterparty_time_lock_script_output = Command::new("movement") + .args(&[ + "move", + "run-script", + "--compiled-script-path", + "protocol-units/bridge/move-modules/build/bridge-modules/bytecode_scripts/set_counterparty_time_lock_duration.mv", + "--args", + "u64: 5", + "--profile", + "default", + "--assume-yes", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output()?; + + if !set_counterparty_time_lock_script_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&update_bridge_operator_output.stdout)); + } + if !set_counterparty_time_lock_script_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&update_bridge_operator_output.stderr)); + } + + Ok(()) + } + + pub fn publish_for_test(&mut self) -> Result<()> { + let random_seed = rand::thread_rng().gen_range(0, 1000000).to_string(); + + let mut process = Command::new("movement") + .args(&["init"]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("Failed to execute command"); + + let private_key_hex = hex::encode(self.signer.private_key().to_bytes()); + + let stdin: &mut std::process::ChildStdin = + process.stdin.as_mut().expect("Failed to open stdin"); + + let movement_dir = PathBuf::from(".movement"); + + if movement_dir.exists() { + stdin.write_all(b"yes\n").expect("Failed to write to stdin"); + } + + stdin.write_all(b"local\n").expect("Failed to write to stdin"); + + let _ = stdin.write_all(format!("{}\n", private_key_hex).as_bytes()); + + let addr_output = process.wait_with_output().expect("Failed to read command output"); + + if !addr_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&addr_output.stdout)); + } + + if !addr_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&addr_output.stderr)); + } + let addr_output_str = String::from_utf8_lossy(&addr_output.stderr); + let address = addr_output_str + .split_whitespace() + .find(|word| word.starts_with("0x")) + .expect("Failed to extract the Movement account address"); + + println!("Extracted address: {}", address); + + let resource_output = Command::new("movement") + .args(&[ + "account", + "derive-resource-account-address", + "--address", + address, + "--seed", + &random_seed, + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output() + .expect("Failed to execute command"); + + // Print the output of the resource address command for debugging + if !resource_output.stdout.is_empty() { + println!("stdout: {}", String::from_utf8_lossy(&resource_output.stdout)); + } + if !resource_output.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&resource_output.stderr)); + } + + // Extract the resource address from the JSON output + let resource_output_str = String::from_utf8_lossy(&resource_output.stdout); + let resource_address = resource_output_str + .lines() + .find(|line| line.contains("\"Result\"")) + .and_then(|line| line.split('"').nth(3)) + .expect("Failed to extract the resource account address"); + + // Ensure the address has a "0x" prefix + let formatted_resource_address = if resource_address.starts_with("0x") { + resource_address.to_string() + } else { + format!("0x{}", resource_address) + }; + + // Set counterparty module address to resource address, for function calls: + self.native_address = AccountAddress::from_hex_literal(&formatted_resource_address)?; + + println!("Derived resource address: {}", formatted_resource_address); + + let current_dir = env::current_dir().expect("Failed to get current directory"); + println!("Current directory: {:?}", current_dir); + + let move_toml_path = PathBuf::from("../move-modules/Move.toml"); + + // Read the existing content of Move.toml + let move_toml_content = + fs::read_to_string(&move_toml_path).expect("Failed to read Move.toml file"); + + // Update the content of Move.toml with the new addresses + let updated_content = move_toml_content + .lines() + .map(|line| match line { + _ if line.starts_with("resource_addr = ") => { + format!(r#"resource_addr = "{}""#, formatted_resource_address) + } + _ if line.starts_with("atomic_bridge = ") => { + format!(r#"atomic_bridge = "{}""#, formatted_resource_address) + } + _ if line.starts_with("moveth = ") => { + format!(r#"moveth = "{}""#, formatted_resource_address) + } + _ if line.starts_with("master_minter = ") => { + format!(r#"master_minter = "{}""#, formatted_resource_address) + } + _ if line.starts_with("minter = ") => { + format!(r#"minter = "{}""#, formatted_resource_address) + } + _ if line.starts_with("admin = ") => { + format!(r#"admin = "{}""#, formatted_resource_address) + } + _ if line.starts_with("origin_addr = ") => { + format!(r#"origin_addr = "{}""#, address) + } + _ if line.starts_with("source_account = ") => { + format!(r#"source_account = "{}""#, address) + } + _ => line.to_string(), + }) + .collect::>() + .join("\n"); + + // Write the updated content back to Move.toml + let mut file = + fs::File::create(&move_toml_path).expect("Failed to open Move.toml file for writing"); + file.write_all(updated_content.as_bytes()) + .expect("Failed to write updated Move.toml file"); + + println!("Move.toml updated successfully."); + + let output2 = Command::new("movement") + .args(&[ + "move", + "create-resource-account-and-publish-package", + "--assume-yes", + "--address-name", + "moveth", + "--seed", + &random_seed, + "--package-dir", + "../move-modules", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output() + .expect("Failed to execute command"); + + if !output2.stdout.is_empty() { + eprintln!("stdout: {}", String::from_utf8_lossy(&output2.stdout)); + } + + if !output2.stderr.is_empty() { + eprintln!("stderr: {}", String::from_utf8_lossy(&output2.stderr)); + } + + if movement_dir.exists() { + fs::remove_dir_all(movement_dir).expect("Failed to delete .movement directory"); + println!(".movement directory deleted successfully."); + } + + // Read the existing content of Move.toml + let move_toml_content = + fs::read_to_string(&move_toml_path).expect("Failed to read Move.toml file"); + + // Directly assign the address + let final_address = "0xcafe"; + + // Directly assign the formatted resource address + let final_formatted_resource_address = + "0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5"; + + let updated_content = move_toml_content + .lines() + .map(|line| match line { + _ if line.starts_with("resource_addr = ") => { + format!(r#"resource_addr = "{}""#, final_formatted_resource_address) + } + _ if line.starts_with("atomic_bridge = ") => { + format!(r#"atomic_bridge = "{}""#, final_formatted_resource_address) + } + _ if line.starts_with("moveth = ") => { + format!(r#"moveth = "{}""#, final_formatted_resource_address) + } + _ if line.starts_with("master_minter = ") => { + format!(r#"master_minter = "{}""#, final_formatted_resource_address) + } + _ if line.starts_with("minter = ") => { + format!(r#"minter = "{}""#, final_formatted_resource_address) + } + _ if line.starts_with("admin = ") => { + format!(r#"admin = "{}""#, final_formatted_resource_address) + } + _ if line.starts_with("origin_addr = ") => { + format!(r#"origin_addr = "{}""#, final_address) + } + _ if line.starts_with("pauser = ") => { + format!(r#"pauser = "{}""#, "0xdafe") + } + _ if line.starts_with("denylister = ") => { + format!(r#"denylister = "{}""#, "0xcade") + } + _ => line.to_string(), + }) + .collect::>() + .join("\n"); + + // Write the updated content back to Move.toml + let mut file = + fs::File::create(&move_toml_path).expect("Failed to open Move.toml file for writing"); + file.write_all(updated_content.as_bytes()) + .expect("Failed to write updated Move.toml file"); + + println!("Move.toml addresses updated successfully at the end of the test."); + + Ok(()) + } + + pub async fn new_for_test() -> Result<(Self, tokio::process::Child), anyhow::Error> { + let kill_cmd = TokioCommand::new("sh") + .arg("-c") + .arg("PID=$(ps aux | grep 'movement node run-local-testnet' | grep -v grep | awk '{print $2}' | head -n 1); if [ -n \"$PID\" ]; then kill -9 $PID; fi") + .output() + .await?; + + if !kill_cmd.status.success() { + println!("Failed to kill running movement process: {:?}", kill_cmd.stderr); + } else { + println!("Movement process killed if it was running."); + } + + let delete_dir_cmd = TokioCommand::new("sh") + .arg("-c") + .arg("if [ -d '.movement' ]; then rm -rf .movement; fi") + .output() + .await?; + + if !delete_dir_cmd.status.success() { + println!("Failed to delete .movement directory: {:?}", delete_dir_cmd.stderr); + } else { + println!(".movement directory deleted if it was present."); + } + + let (setup_complete_tx, setup_complete_rx) = oneshot::channel(); + let mut child = TokioCommand::new("movement") + .args(&["node", "run-local-testnet", "--force-restart", "--assume-yes"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()?; + + let stdout = child.stdout.take().expect("Failed to capture stdout"); + let stderr = child.stderr.take().expect("Failed to capture stderr"); + + task::spawn(async move { + let mut stdout_reader = BufReader::new(stdout).lines(); + let mut stderr_reader = BufReader::new(stderr).lines(); + + loop { + tokio::select! { + line = stdout_reader.next_line() => { + match line { + Ok(Some(line)) => { + println!("STDOUT: {}", line); + if line.contains("Setup is complete") { + println!("Testnet is up and running!"); + let _ = setup_complete_tx.send(()); + return Ok(()); + } + }, + Ok(_) => { + return Err(anyhow::anyhow!("Unexpected end of stdout stream")); + }, + Err(e) => { + return Err(anyhow::anyhow!("Error reading stdout: {}", e)); + } + } + }, + line = stderr_reader.next_line() => { + match line { + Ok(Some(line)) => { + println!("STDERR: {}", line); + if line.contains("Setup is complete") { + println!("Testnet is up and running!"); + let _ = setup_complete_tx.send(()); + return Ok(()); + } + }, + Ok(_) => { + return Err(anyhow::anyhow!("Unexpected end of stderr stream")); + } + Err(e) => { + return Err(anyhow::anyhow!("Error reading stderr: {}", e)); + } + } + } + } + } + }); + + setup_complete_rx.await.expect("Failed to receive setup completion signal"); + println!("Setup complete message received."); + + let node_connection_url = "http://127.0.0.1:8080".to_string(); + let node_connection_url = Url::from_str(node_connection_url.as_str()) + .map_err(|_| BridgeContractError::SerializationError)?; + let rest_client = Client::new(node_connection_url.clone()); + + let mut rng = ::rand::rngs::StdRng::from_seed([3u8; 32]); + Ok(( + MovementClientFramework { + native_address: DUMMY_ADDRESS, + non_native_address: Vec::new(), + rest_client, + signer: Arc::new(LocalAccount::generate(&mut rng)), + }, + child, + )) + } +} diff --git a/protocol-units/bridge/service/src/chains/movement/mod.rs b/protocol-units/bridge/service/src/chains/movement/mod.rs index a84b043da..52a8ac4a5 100644 --- a/protocol-units/bridge/service/src/chains/movement/mod.rs +++ b/protocol-units/bridge/service/src/chains/movement/mod.rs @@ -1,3 +1,4 @@ pub mod client; +pub mod client_framework; pub mod event_monitoring; pub mod utils; diff --git a/protocol-units/bridge/service/src/types.rs b/protocol-units/bridge/service/src/types.rs index 3fab870a2..116c3487c 100644 --- a/protocol-units/bridge/service/src/types.rs +++ b/protocol-units/bridge/service/src/types.rs @@ -224,6 +224,17 @@ pub struct BridgeTransferDetails { pub state: u8, } +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +pub struct BridgeTransferDetailsCounterparty { + pub bridge_transfer_id: BridgeTransferId, + pub initiator_address: BridgeAddress>, + pub recipient_address: BridgeAddress, + pub hash_lock: HashLock, + pub time_lock: TimeLock, + pub amount: Amount, + pub state: u8, +} + #[derive(Debug, PartialEq, Eq, Clone, Deserialize)] pub struct LockDetails { pub bridge_transfer_id: BridgeTransferId, diff --git a/protocol-units/bridge/setup/src/deploy.rs b/protocol-units/bridge/setup/src/deploy.rs index b731a500b..91832af53 100644 --- a/protocol-units/bridge/setup/src/deploy.rs +++ b/protocol-units/bridge/setup/src/deploy.rs @@ -159,7 +159,7 @@ pub fn deploy_local_movement_node(config: &mut MovementConfig) -> Result<(), any // stdin.write_all(b"local\n").expect("Failed to write to stdin"); - let private_key_bytes = config.movement_signer_address.to_bytes(); + let private_key_bytes = config.movement_signer_key.to_bytes(); let private_key_hex = format!("0x{}", private_key_bytes.encode_hex::()); let _ = stdin.write_all(format!("{}\n", private_key_hex).as_bytes()); diff --git a/protocol-units/bridge/setup/src/local.rs b/protocol-units/bridge/setup/src/local.rs index f714ad551..5cc565021 100644 --- a/protocol-units/bridge/setup/src/local.rs +++ b/protocol-units/bridge/setup/src/local.rs @@ -117,7 +117,7 @@ pub async fn setup_movement_node( let mut rng = ::rand::rngs::StdRng::from_seed([3u8; 32]); let signer = LocalAccount::generate(&mut rng); - config.movement_signer_address = signer.private_key().clone(); + config.movement_signer_key = signer.private_key().clone(); Ok(child) } diff --git a/protocol-units/bridge/setup/src/main.rs b/protocol-units/bridge/setup/src/main.rs index 708556ba3..d992ac7b6 100644 --- a/protocol-units/bridge/setup/src/main.rs +++ b/protocol-units/bridge/setup/src/main.rs @@ -60,7 +60,7 @@ async fn main() -> Result<(), anyhow::Error> { maptos_config.client.maptos_faucet_rest_connection_port; //update signer with maptos private key - config.movement.movement_signer_address = maptos_config.chain.maptos_private_key; + config.movement.movement_signer_key = maptos_config.chain.maptos_private_key; } if let Ok(settlement_config) = settlement_config { println!("Update bridge config with settlement config");