From f36aa530a34edcb0fcb50914d56ef6be25172373 Mon Sep 17 00:00:00 2001 From: Nic-dorman Date: Thu, 9 Apr 2026 16:26:11 +0100 Subject: [PATCH] feat!: unify payment_vault_address across daemon and all SDKs ant-node unified data_payments_address + merkle_payments_address into a single payment_vault_address (PaymentVault contract). This adapts antd and all 15 SDK clients to the new field. BREAKING CHANGE: PrepareUploadResponse now returns payment_vault_address instead of separate data_payments_address / merkle_payments_address. OpenAPI version bumped to 2.0.0. Changes: - antd: single EVM_PAYMENT_VAULT_ADDRESS env var (EVM_DATA_PAYMENTS_ADDRESS honored as fallback), unified response field in types.rs and upload.rs - All SDKs: model, client, and test updates (Go, JS, Python, Rust, C#, C++, Dart, Elixir, Java, Kotlin, Lua, PHP, Ruby, Swift, MCP, FFI) - FFI: evmlib 0.5.0 -> 0.8.0 to align with antd - Scripts: start-local.sh/.ps1 and ant-dev emit EVM_PAYMENT_VAULT_ADDRESS - C++ cleanup: remove stale graph entry code from async/grpc clients - Docs: README, openapi.yaml, skill.md, llms-full.txt updated Co-Authored-By: Claude Opus 4.6 (1M context) --- ant-dev/src/ant_dev/cmd_start.py | 4 +- antd-cpp/include/antd/async_client.hpp | 17 ----- antd-cpp/include/antd/models.hpp | 3 +- antd-cpp/src/async_client.cpp | 37 ---------- antd-cpp/src/client.cpp | 3 +- antd-cpp/src/grpc_client.cpp | 69 ------------------- antd-cpp/tests/test_client.cpp | 43 ++---------- antd-cpp/tests/test_grpc_client.cpp | 31 --------- antd-csharp/Antd.Sdk.Tests/UnitTests.cs | 11 ++- antd-csharp/Antd.Sdk/AntdRestClient.cs | 10 ++- antd-csharp/Antd.Sdk/Models.cs | 5 +- antd-dart/lib/src/models.dart | 12 +--- antd-elixir/lib/antd/client.ex | 5 +- antd-elixir/lib/antd/models.ex | 12 ++-- antd-elixir/test/antd/client_test.exs | 10 ++- antd-go/client.go | 3 +- antd-go/client_test.go | 26 +++---- antd-go/models.go | 17 +++-- .../java/com/autonomi/antd/AntdClient.java | 7 +- .../antd/models/PrepareUploadResult.java | 8 +-- .../com/autonomi/antd/AntdClientTest.java | 9 ++- antd-js/src/models.ts | 3 +- antd-js/src/rest-client.test.ts | 13 ++-- antd-js/src/rest-client.ts | 12 ++-- .../kotlin/com/autonomi/sdk/AntdRestClient.kt | 3 +- .../main/kotlin/com/autonomi/sdk/Models.kt | 6 +- antd-lua/spec/client_spec.lua | 8 +-- antd-lua/src/antd/client.lua | 3 +- antd-mcp/src/antd_mcp/server.py | 3 +- antd-php/src/AntdClient.php | 12 ++-- antd-py/src/antd/_rest.py | 3 +- antd-py/src/antd/models.py | 3 +- antd-py/tests/test_rest_client.py | 11 ++- antd-ruby/lib/antd/client.rb | 5 +- antd-ruby/lib/antd/models.rb | 4 +- antd-ruby/test/test_client.rb | 9 ++- antd-rust/src/client.rs | 6 +- antd-rust/src/models.rs | 7 +- antd-rust/src/tests.rs | 11 ++- .../Sources/AntdSdk/AntdRestClient.swift | 8 +-- antd-swift/Sources/AntdSdk/Models.swift | 10 +-- antd/README.md | 5 +- antd/openapi.yaml | 13 ++-- antd/src/main.rs | 10 ++- antd/src/rest/upload.rs | 15 ++-- antd/src/types.rs | 20 ++---- ffi/rust/ant-ffi/Cargo.toml | 2 +- ffi/rust/ant-ffi/src/client.rs | 4 +- ffi/rust/ant-ffi/src/wallet.rs | 4 +- llms-full.txt | 4 +- scripts/start-local.ps1 | 6 +- scripts/start-local.sh | 6 +- scripts/test-api.sh | 8 ++- skill.md | 4 +- 54 files changed, 162 insertions(+), 421 deletions(-) diff --git a/ant-dev/src/ant_dev/cmd_start.py b/ant-dev/src/ant_dev/cmd_start.py index 02225a6..a081d0f 100644 --- a/ant-dev/src/ant_dev/cmd_start.py +++ b/ant-dev/src/ant_dev/cmd_start.py @@ -126,9 +126,7 @@ def run(args) -> None: evm = manifest["evm"] antd_env["EVM_RPC_URL"] = evm.get("rpc_url", "") antd_env["EVM_PAYMENT_TOKEN_ADDRESS"] = evm.get("payment_token_address", "") - antd_env["EVM_DATA_PAYMENTS_ADDRESS"] = evm.get("data_payments_address", "") - if evm.get("merkle_payments_address"): - antd_env["EVM_MERKLE_PAYMENTS_ADDRESS"] = evm["merkle_payments_address"] + antd_env["EVM_PAYMENT_VAULT_ADDRESS"] = evm.get("payment_vault_address", evm.get("data_payments_address", "")) antd_cmd = ["cargo", "run", "--", "--network", "local"] antd_proc = start_process(antd_cmd, cwd=antd_dir, env=antd_env, log_file=LOG_FILE) diff --git a/antd-cpp/include/antd/async_client.hpp b/antd-cpp/include/antd/async_client.hpp index f31029c..f8e663c 100644 --- a/antd-cpp/include/antd/async_client.hpp +++ b/antd-cpp/include/antd/async_client.hpp @@ -65,23 +65,6 @@ class AsyncClient { /// Retrieve a chunk by address. std::future> chunk_get(std::string address); - // --- Graph Entries (DAG Nodes) --- - - /// Create a new graph entry. - std::future graph_entry_put(std::string owner_secret_key, - std::vector parents, - std::string content, - std::vector descendants); - - /// Retrieve a graph entry by address. - std::future graph_entry_get(std::string address); - - /// Check if a graph entry exists at the given address. - std::future graph_entry_exists(std::string address); - - /// Estimate the cost of creating a graph entry. - std::future graph_entry_cost(std::string public_key); - // --- Files & Directories --- /// Upload a local file to the network. diff --git a/antd-cpp/include/antd/models.hpp b/antd-cpp/include/antd/models.hpp index 1fc7821..0dc85c5 100644 --- a/antd-cpp/include/antd/models.hpp +++ b/antd-cpp/include/antd/models.hpp @@ -57,16 +57,15 @@ struct PrepareUploadResult { // Wave-batch fields (present when payment_type == "wave_batch") std::vector payments; // per-quote payments for payForQuotes() - std::string data_payments_address; // wave-batch contract address // Merkle fields (present when payment_type == "merkle") int depth{0}; // merkle tree depth (1-8) std::vector pool_commitments; // for payForMerkleTree() uint64_t merkle_payment_timestamp{0}; // unix seconds - std::string merkle_payments_address; // merkle vault contract // Common fields (always present) std::string total_amount; + std::string payment_vault_address; // unified payment vault contract address std::string payment_token_address; // token contract address std::string rpc_url; // EVM RPC URL }; diff --git a/antd-cpp/src/async_client.cpp b/antd-cpp/src/async_client.cpp index d879f55..1ba4d5f 100644 --- a/antd-cpp/src/async_client.cpp +++ b/antd-cpp/src/async_client.cpp @@ -74,43 +74,6 @@ std::future> AsyncClient::chunk_get(std::string address) { }); } -// --------------------------------------------------------------------------- -// Graph Entries (DAG Nodes) -// --------------------------------------------------------------------------- - -std::future AsyncClient::graph_entry_put( - std::string owner_secret_key, - std::vector parents, - std::string content, - std::vector descendants) { - return std::async(std::launch::async, - [this, - osk = std::move(owner_secret_key), - p = std::move(parents), - c = std::move(content), - d = std::move(descendants)] { - return client_.graph_entry_put(osk, p, c, d); - }); -} - -std::future AsyncClient::graph_entry_get(std::string address) { - return std::async(std::launch::async, [this, addr = std::move(address)] { - return client_.graph_entry_get(addr); - }); -} - -std::future AsyncClient::graph_entry_exists(std::string address) { - return std::async(std::launch::async, [this, addr = std::move(address)] { - return client_.graph_entry_exists(addr); - }); -} - -std::future AsyncClient::graph_entry_cost(std::string public_key) { - return std::async(std::launch::async, [this, pk = std::move(public_key)] { - return client_.graph_entry_cost(pk); - }); -} - // --------------------------------------------------------------------------- // Files & Directories // --------------------------------------------------------------------------- diff --git a/antd-cpp/src/client.cpp b/antd-cpp/src/client.cpp index 1e11fce..7e844ac 100644 --- a/antd-cpp/src/client.cpp +++ b/antd-cpp/src/client.cpp @@ -268,7 +268,7 @@ static PrepareUploadResult parse_prepare_response(const json& j) { result.upload_id = j.value("upload_id", ""); result.payment_type = j.value("payment_type", ""); result.total_amount = j.value("total_amount", ""); - result.data_payments_address = j.value("data_payments_address", ""); + result.payment_vault_address = j.value("payment_vault_address", ""); result.payment_token_address = j.value("payment_token_address", ""); result.rpc_url = j.value("rpc_url", ""); @@ -294,7 +294,6 @@ static PrepareUploadResult parse_prepare_response(const json& j) { if (result.payment_type == "merkle") { result.depth = j.value("depth", 0); result.merkle_payment_timestamp = j.value("merkle_payment_timestamp", uint64_t{0}); - result.merkle_payments_address = j.value("merkle_payments_address", ""); if (j.contains("pool_commitments") && j["pool_commitments"].is_array()) { for (const auto& pc : j["pool_commitments"]) { diff --git a/antd-cpp/src/grpc_client.cpp b/antd-cpp/src/grpc_client.cpp index f59fb69..a2bcb3f 100644 --- a/antd-cpp/src/grpc_client.cpp +++ b/antd-cpp/src/grpc_client.cpp @@ -172,75 +172,6 @@ std::vector GrpcClient::chunk_get(std::string_view address) { return std::vector(d.begin(), d.end()); } -// --------------------------------------------------------------------------- -// Graph Entries (DAG Nodes) -// --------------------------------------------------------------------------- - -PutResult GrpcClient::graph_entry_put(std::string_view owner_secret_key, - const std::vector& parents, - std::string_view content, - const std::vector& descendants) { - grpc::ClientContext ctx; - antd::v1::PutGraphEntryRequest req; - req.set_owner_secret_key(std::string(owner_secret_key)); - for (const auto& p : parents) { - req.add_parents(p); - } - req.set_content(std::string(content)); - for (const auto& d : descendants) { - auto* desc = req.add_descendants(); - desc->set_public_key(d.public_key); - desc->set_content(d.content); - } - antd::v1::PutGraphEntryResponse resp; - check_status(impl_->graph_stub->Put(&ctx, req, &resp)); - return PutResult{ - .cost = resp.cost().atto_tokens(), - .address = resp.address(), - }; -} - -GraphEntry GrpcClient::graph_entry_get(std::string_view address) { - grpc::ClientContext ctx; - antd::v1::GetGraphEntryRequest req; - req.set_address(std::string(address)); - antd::v1::GetGraphEntryResponse resp; - check_status(impl_->graph_stub->Get(&ctx, req, &resp)); - - GraphEntry entry; - entry.owner = resp.owner(); - entry.content = resp.content(); - for (int i = 0; i < resp.parents_size(); ++i) { - entry.parents.push_back(resp.parents(i)); - } - for (int i = 0; i < resp.descendants_size(); ++i) { - const auto& d = resp.descendants(i); - entry.descendants.push_back(GraphDescendant{ - .public_key = d.public_key(), - .content = d.content(), - }); - } - return entry; -} - -bool GrpcClient::graph_entry_exists(std::string_view address) { - grpc::ClientContext ctx; - antd::v1::CheckGraphEntryRequest req; - req.set_address(std::string(address)); - antd::v1::GraphExistsResponse resp; - check_status(impl_->graph_stub->CheckExistence(&ctx, req, &resp)); - return resp.exists(); -} - -std::string GrpcClient::graph_entry_cost(std::string_view public_key) { - grpc::ClientContext ctx; - antd::v1::GraphEntryCostRequest req; - req.set_public_key(std::string(public_key)); - antd::v1::Cost resp; - check_status(impl_->graph_stub->GetCost(&ctx, req, &resp)); - return resp.atto_tokens(); -} - // --------------------------------------------------------------------------- // Files & Directories // --------------------------------------------------------------------------- diff --git a/antd-cpp/tests/test_client.cpp b/antd-cpp/tests/test_client.cpp index 88cc4bd..af23458 100644 --- a/antd-cpp/tests/test_client.cpp +++ b/antd-cpp/tests/test_client.cpp @@ -101,35 +101,6 @@ TEST_CASE("PutResult from JSON") { CHECK(r.address == "abc123"); } -TEST_CASE("GraphEntry from JSON") { - auto j = json::parse(R"({ - "owner":"owner1", - "parents":["p1","p2"], - "content":"abc", - "descendants":[{"public_key":"pk1","content":"desc1"}] - })"); - - antd::GraphEntry entry; - entry.owner = j.value("owner", ""); - entry.content = j.value("content", ""); - for (const auto& p : j["parents"]) { - entry.parents.push_back(p.get()); - } - for (const auto& d : j["descendants"]) { - entry.descendants.push_back(antd::GraphDescendant{ - d.value("public_key", ""), - d.value("content", ""), - }); - } - - CHECK(entry.owner == "owner1"); - CHECK(entry.parents.size() == 2); - CHECK(entry.parents[0] == "p1"); - CHECK(entry.content == "abc"); - CHECK(entry.descendants.size() == 1); - CHECK(entry.descendants[0].public_key == "pk1"); -} - // --------------------------------------------------------------------------- // PrepareUploadResult: merkle payment parsing // --------------------------------------------------------------------------- @@ -140,8 +111,8 @@ TEST_CASE("PrepareUploadResult merkle from JSON") { "payment_type": "merkle", "depth": 5, "merkle_payment_timestamp": 1712150400, - "merkle_payments_address": "0xmerkle", "total_amount": "0", + "payment_vault_address": "0xvault", "payment_token_address": "0xtoken", "rpc_url": "http://rpc.example.com", "pool_commitments": [ @@ -160,7 +131,7 @@ TEST_CASE("PrepareUploadResult merkle from JSON") { r.upload_id = j.value("upload_id", ""); r.payment_type = j.value("payment_type", ""); r.total_amount = j.value("total_amount", ""); - r.data_payments_address = j.value("data_payments_address", ""); + r.payment_vault_address = j.value("payment_vault_address", ""); r.payment_token_address = j.value("payment_token_address", ""); r.rpc_url = j.value("rpc_url", ""); @@ -183,7 +154,6 @@ TEST_CASE("PrepareUploadResult merkle from JSON") { if (r.payment_type == "merkle") { r.depth = j.value("depth", 0); r.merkle_payment_timestamp = j.value("merkle_payment_timestamp", uint64_t{0}); - r.merkle_payments_address = j.value("merkle_payments_address", ""); if (j.contains("pool_commitments") && j["pool_commitments"].is_array()) { for (const auto& pc : j["pool_commitments"]) { @@ -209,8 +179,8 @@ TEST_CASE("PrepareUploadResult merkle from JSON") { CHECK(r.payment_type == "merkle"); CHECK(r.depth == 5); CHECK(r.merkle_payment_timestamp == 1712150400); - CHECK(r.merkle_payments_address == "0xmerkle"); CHECK(r.total_amount == "0"); + CHECK(r.payment_vault_address == "0xvault"); CHECK(r.payment_token_address == "0xtoken"); CHECK(r.rpc_url == "http://rpc.example.com"); CHECK(r.payments.empty()); @@ -258,7 +228,7 @@ TEST_CASE("PrepareUploadResult backward compat - no payment_type defaults to wav auto j = json::parse(R"({ "upload_id": "up_old", "total_amount": "5000", - "data_payments_address": "0xdp", + "payment_vault_address": "0xvault", "payment_token_address": "0xtoken", "rpc_url": "http://rpc.old.com", "payments": [ @@ -271,7 +241,7 @@ TEST_CASE("PrepareUploadResult backward compat - no payment_type defaults to wav r.upload_id = j.value("upload_id", ""); r.payment_type = j.value("payment_type", ""); r.total_amount = j.value("total_amount", ""); - r.data_payments_address = j.value("data_payments_address", ""); + r.payment_vault_address = j.value("payment_vault_address", ""); r.payment_token_address = j.value("payment_token_address", ""); r.rpc_url = j.value("rpc_url", ""); @@ -294,7 +264,7 @@ TEST_CASE("PrepareUploadResult backward compat - no payment_type defaults to wav CHECK(r.payment_type == "wave_batch"); CHECK(r.upload_id == "up_old"); CHECK(r.total_amount == "5000"); - CHECK(r.data_payments_address == "0xdp"); + CHECK(r.payment_vault_address == "0xvault"); REQUIRE(r.payments.size() == 2); CHECK(r.payments[0].quote_hash == "qh1"); CHECK(r.payments[1].quote_hash == "qh2"); @@ -302,7 +272,6 @@ TEST_CASE("PrepareUploadResult backward compat - no payment_type defaults to wav // Merkle fields should be at defaults CHECK(r.depth == 0); CHECK(r.merkle_payment_timestamp == 0); - CHECK(r.merkle_payments_address.empty()); CHECK(r.pool_commitments.empty()); } diff --git a/antd-cpp/tests/test_grpc_client.cpp b/antd-cpp/tests/test_grpc_client.cpp index c16be82..8d51cc7 100644 --- a/antd-cpp/tests/test_grpc_client.cpp +++ b/antd-cpp/tests/test_grpc_client.cpp @@ -183,37 +183,6 @@ TEST_CASE("PutResult from gRPC chunk put response") { CHECK(r.address == "chunk1"); } -TEST_CASE("GraphEntry from gRPC response fields") { - // Simulates parsing a GetGraphEntryResponse - antd::GraphEntry entry; - entry.owner = "owner1"; - entry.content = "abc"; - entry.parents = {}; // empty parents list - entry.descendants.push_back(antd::GraphDescendant{ - .public_key = "pk1", - .content = "desc1", - }); - - CHECK(entry.owner == "owner1"); - CHECK(entry.content == "abc"); - CHECK(entry.parents.empty()); - CHECK(entry.descendants.size() == 1); - CHECK(entry.descendants[0].public_key == "pk1"); - CHECK(entry.descendants[0].content == "desc1"); -} - -TEST_CASE("GraphEntry with parents from gRPC response") { - antd::GraphEntry entry; - entry.owner = "owner1"; - entry.content = "abc"; - entry.parents = {"p1", "p2"}; - entry.descendants = {}; - - CHECK(entry.parents.size() == 2); - CHECK(entry.parents[0] == "p1"); - CHECK(entry.parents[1] == "p2"); -} - TEST_CASE("PutResult from gRPC graph entry put response") { antd::PutResult r; r.cost = "500"; diff --git a/antd-csharp/Antd.Sdk.Tests/UnitTests.cs b/antd-csharp/Antd.Sdk.Tests/UnitTests.cs index ca76855..c374c4c 100644 --- a/antd-csharp/Antd.Sdk.Tests/UnitTests.cs +++ b/antd-csharp/Antd.Sdk.Tests/UnitTests.cs @@ -412,7 +412,7 @@ public async Task PrepareUploadAsync_ReturnsPrepareResult() new { quote_hash = "qh1", rewards_address = "ra1", amount = "100" } }, total_amount = "100", - data_payments_address = "dpa1", + payment_vault_address = "pva1", payment_token_address = "pta1", rpc_url = "https://rpc.example.com" }); @@ -452,7 +452,7 @@ public async Task PrepareUploadAsync_Merkle_ReturnsPoolCommitments() upload_id = "up_merkle_1", payments = Array.Empty(), total_amount = "500", - data_payments_address = "dpa_m", + payment_vault_address = "pva_m", payment_token_address = "pta_m", rpc_url = "https://rpc.example.com", payment_type = "merkle_batch", @@ -469,8 +469,7 @@ public async Task PrepareUploadAsync_Merkle_ReturnsPoolCommitments() } } }, - merkle_payment_timestamp = 1700000000L, - merkle_payments_address = "mpa_1" + merkle_payment_timestamp = 1700000000L }); _server.Start(); @@ -488,7 +487,6 @@ public async Task PrepareUploadAsync_Merkle_ReturnsPoolCommitments() Assert.Equal("ra_2", result.PoolCommitments[0].Candidates[1].RewardsAddress); Assert.Equal("300", result.PoolCommitments[0].Candidates[1].Amount); Assert.Equal(1700000000L, result.MerklePaymentTimestamp); - Assert.Equal("mpa_1", result.MerklePaymentsAddress); Assert.Equal("500", result.TotalAmount); Assert.Empty(result.Payments); } @@ -521,7 +519,7 @@ public async Task PrepareUploadAsync_BackwardCompat_DefaultsPaymentType() new { quote_hash = "qh1", rewards_address = "ra1", amount = "100" } }, total_amount = "100", - data_payments_address = "dpa1", + payment_vault_address = "pva1", payment_token_address = "pta1", rpc_url = "https://rpc.example.com" }); @@ -534,7 +532,6 @@ public async Task PrepareUploadAsync_BackwardCompat_DefaultsPaymentType() Assert.Null(result.Depth); Assert.Null(result.PoolCommitments); Assert.Null(result.MerklePaymentTimestamp); - Assert.Null(result.MerklePaymentsAddress); Assert.Single(result.Payments); Assert.Equal("qh1", result.Payments[0].QuoteHash); } diff --git a/antd-csharp/Antd.Sdk/AntdRestClient.cs b/antd-csharp/Antd.Sdk/AntdRestClient.cs index 245bbd6..76125cb 100644 --- a/antd-csharp/Antd.Sdk/AntdRestClient.cs +++ b/antd-csharp/Antd.Sdk/AntdRestClient.cs @@ -248,13 +248,12 @@ private static PrepareUploadResult MapPrepareUpload(PrepareUploadDto resp) new PoolCommitmentEntry(pc.PoolHash, pc.Candidates.Select(c => new CandidateNodeEntry(c.RewardsAddress, c.Amount)).ToList()) ).ToList(); return new PrepareUploadResult( - resp.UploadId, payments, resp.TotalAmount, resp.DataPaymentsAddress, + resp.UploadId, payments, resp.TotalAmount, resp.PaymentVaultAddress, resp.PaymentTokenAddress, resp.RpcUrl, PaymentType: resp.PaymentType ?? "wave_batch", Depth: resp.Depth, PoolCommitments: poolCommitments, - MerklePaymentTimestamp: resp.MerklePaymentTimestamp, - MerklePaymentsAddress: resp.MerklePaymentsAddress); + MerklePaymentTimestamp: resp.MerklePaymentTimestamp); } // ── Internal DTOs for JSON deserialization ── @@ -304,14 +303,13 @@ private sealed record PrepareUploadDto( [property: JsonPropertyName("upload_id")] string UploadId, [property: JsonPropertyName("payments")] List? Payments, [property: JsonPropertyName("total_amount")] string TotalAmount, - [property: JsonPropertyName("data_payments_address")] string DataPaymentsAddress, + [property: JsonPropertyName("payment_vault_address")] string PaymentVaultAddress, [property: JsonPropertyName("payment_token_address")] string PaymentTokenAddress, [property: JsonPropertyName("rpc_url")] string RpcUrl, [property: JsonPropertyName("payment_type")] string? PaymentType = null, [property: JsonPropertyName("depth")] int? Depth = null, [property: JsonPropertyName("pool_commitments")] List? PoolCommitments = null, - [property: JsonPropertyName("merkle_payment_timestamp")] long? MerklePaymentTimestamp = null, - [property: JsonPropertyName("merkle_payments_address")] string? MerklePaymentsAddress = null); + [property: JsonPropertyName("merkle_payment_timestamp")] long? MerklePaymentTimestamp = null); private sealed record FinalizeUploadDto( [property: JsonPropertyName("address")] string Address, diff --git a/antd-csharp/Antd.Sdk/Models.cs b/antd-csharp/Antd.Sdk/Models.cs index 9f20199..fe3eeda 100644 --- a/antd-csharp/Antd.Sdk/Models.cs +++ b/antd-csharp/Antd.Sdk/Models.cs @@ -26,14 +26,13 @@ public sealed record PrepareUploadResult( string UploadId, List Payments, string TotalAmount, - string DataPaymentsAddress, + string PaymentVaultAddress, string PaymentTokenAddress, string RpcUrl, string PaymentType = "wave_batch", int? Depth = null, List? PoolCommitments = null, - long? MerklePaymentTimestamp = null, - string? MerklePaymentsAddress = null); + long? MerklePaymentTimestamp = null); /// Result of finalizing an externally-signed upload. public sealed record FinalizeUploadResult(string Address, long ChunksStored); diff --git a/antd-dart/lib/src/models.dart b/antd-dart/lib/src/models.dart index 99c4992..48e6e72 100644 --- a/antd-dart/lib/src/models.dart +++ b/antd-dart/lib/src/models.dart @@ -166,7 +166,7 @@ class PrepareUploadResult { final String uploadId; final List payments; final String totalAmount; - final String dataPaymentsAddress; + final String paymentVaultAddress; final String paymentTokenAddress; final String rpcUrl; @@ -182,21 +182,17 @@ class PrepareUploadResult { /// Unix-seconds timestamp for the merkle payment. Present only when [paymentType] == "merkle". final int? merklePaymentTimestamp; - /// Merkle vault contract address. Present only when [paymentType] == "merkle". - final String? merklePaymentsAddress; - const PrepareUploadResult({ required this.uploadId, required this.payments, required this.totalAmount, - required this.dataPaymentsAddress, + required this.paymentVaultAddress, required this.paymentTokenAddress, required this.rpcUrl, this.paymentType = 'wave_batch', this.depth, this.poolCommitments, this.merklePaymentTimestamp, - this.merklePaymentsAddress, }); factory PrepareUploadResult.fromJson(Map json) { @@ -207,7 +203,7 @@ class PrepareUploadResult { .toList() ?? [], totalAmount: json['total_amount'] as String? ?? '', - dataPaymentsAddress: json['data_payments_address'] as String? ?? '', + paymentVaultAddress: json['payment_vault_address'] as String? ?? '', paymentTokenAddress: json['payment_token_address'] as String? ?? '', rpcUrl: json['rpc_url'] as String? ?? '', paymentType: json['payment_type'] as String? ?? 'wave_batch', @@ -218,8 +214,6 @@ class PrepareUploadResult { .toList(), merklePaymentTimestamp: (json['merkle_payment_timestamp'] as num?)?.toInt(), - merklePaymentsAddress: - json['merkle_payments_address'] as String?, ); } diff --git a/antd-elixir/lib/antd/client.ex b/antd-elixir/lib/antd/client.ex index 0d96b0d..69ca296 100644 --- a/antd-elixir/lib/antd/client.ex +++ b/antd-elixir/lib/antd/client.ex @@ -477,14 +477,13 @@ defmodule Antd.Client do upload_id: body["upload_id"] || "", payments: payments, total_amount: body["total_amount"] || "", - data_payments_address: body["data_payments_address"] || "", + payment_vault_address: body["payment_vault_address"] || "", payment_token_address: body["payment_token_address"] || "", rpc_url: body["rpc_url"] || "", payment_type: payment_type, depth: body["depth"] || 0, pool_commitments: pool_commitments, - merkle_payment_timestamp: body["merkle_payment_timestamp"] || 0, - merkle_payments_address: body["merkle_payments_address"] || "" + merkle_payment_timestamp: body["merkle_payment_timestamp"] || 0 } end diff --git a/antd-elixir/lib/antd/models.ex b/antd-elixir/lib/antd/models.ex index 630ef4c..b5bd1e4 100644 --- a/antd-elixir/lib/antd/models.ex +++ b/antd-elixir/lib/antd/models.ex @@ -85,33 +85,31 @@ end defmodule Antd.PrepareUploadResult do @moduledoc "Result of preparing an upload for external signing." - @enforce_keys [:upload_id, :payments, :total_amount, :data_payments_address, :payment_token_address, :rpc_url] + @enforce_keys [:upload_id, :payments, :total_amount, :payment_vault_address, :payment_token_address, :rpc_url] defstruct [ :upload_id, :payments, :total_amount, - :data_payments_address, + :payment_vault_address, :payment_token_address, :rpc_url, :payment_type, :depth, :pool_commitments, - :merkle_payment_timestamp, - :merkle_payments_address + :merkle_payment_timestamp ] @type t :: %__MODULE__{ upload_id: String.t(), payments: [Antd.PaymentInfo.t()], total_amount: String.t(), - data_payments_address: String.t(), + payment_vault_address: String.t(), payment_token_address: String.t(), rpc_url: String.t(), payment_type: String.t() | nil, depth: integer() | nil, pool_commitments: [Antd.PoolCommitmentEntry.t()] | nil, - merkle_payment_timestamp: integer() | nil, - merkle_payments_address: String.t() | nil + merkle_payment_timestamp: integer() | nil } end diff --git a/antd-elixir/test/antd/client_test.exs b/antd-elixir/test/antd/client_test.exs index 035747a..c9e4bf2 100644 --- a/antd-elixir/test/antd/client_test.exs +++ b/antd-elixir/test/antd/client_test.exs @@ -271,7 +271,7 @@ defmodule Antd.ClientTest do upload_id: "up1", payments: [%{quote_hash: "qh1", rewards_address: "ra1", amount: "100"}], total_amount: "100", - data_payments_address: "dpa1", + payment_vault_address: "pva1", payment_token_address: "pta1", rpc_url: "http://rpc", payment_type: "wave_batch" @@ -294,7 +294,7 @@ defmodule Antd.ClientTest do upload_id: "up2", payments: [], total_amount: "0", - data_payments_address: "dpa2", + payment_vault_address: "pva2", payment_token_address: "pta2", rpc_url: "http://rpc" })) @@ -312,13 +312,12 @@ defmodule Antd.ClientTest do upload_id: "up3", payments: [], total_amount: "500", - data_payments_address: "dpa3", + payment_vault_address: "pva3", payment_token_address: "pta3", rpc_url: "http://rpc", payment_type: "merkle_batch", depth: 4, merkle_payment_timestamp: 1234567890, - merkle_payments_address: "mpa1", pool_commitments: [ %{ pool_hash: "ph1", @@ -341,7 +340,6 @@ defmodule Antd.ClientTest do assert result.payment_type == "merkle_batch" assert result.depth == 4 assert result.merkle_payment_timestamp == 1234567890 - assert result.merkle_payments_address == "mpa1" assert length(result.pool_commitments) == 2 [pool1, pool2] = result.pool_commitments @@ -365,7 +363,7 @@ defmodule Antd.ClientTest do upload_id: "up4", payments: [%{quote_hash: "qh2", rewards_address: "ra2", amount: "50"}], total_amount: "50", - data_payments_address: "dpa4", + payment_vault_address: "pva4", payment_token_address: "pta4", rpc_url: "http://rpc", payment_type: "wave_batch" diff --git a/antd-go/client.go b/antd-go/client.go index 653b69c..c5bccc6 100644 --- a/antd-go/client.go +++ b/antd-go/client.go @@ -365,7 +365,7 @@ func parsePrepareResponse(j map[string]any) *PrepareUploadResult { UploadID: str(j, "upload_id"), PaymentType: str(j, "payment_type"), TotalAmount: str(j, "total_amount"), - DataPaymentsAddress: str(j, "data_payments_address"), + PaymentVaultAddress: str(j, "payment_vault_address"), PaymentTokenAddress: str(j, "payment_token_address"), RPCUrl: str(j, "rpc_url"), } @@ -390,7 +390,6 @@ func parsePrepareResponse(j map[string]any) *PrepareUploadResult { if result.PaymentType == "merkle" { result.Depth = int(num64(j, "depth")) result.MerklePaymentTimestamp = uint64(num64(j, "merkle_payment_timestamp")) - result.MerklePaymentsAddress = str(j, "merkle_payments_address") for _, pc := range arrAt(j, "pool_commitments") { if pcm, ok := pc.(map[string]any); ok { diff --git a/antd-go/client_test.go b/antd-go/client_test.go index 0b5de38..083009b 100644 --- a/antd-go/client_test.go +++ b/antd-go/client_test.go @@ -78,7 +78,7 @@ func mockDaemon(t *testing.T) *httptest.Server { "payment_type": "wave_batch", "payments": []any{map[string]any{"quote_hash": "qh1", "rewards_address": "ra1", "amount": "100"}}, "total_amount": "100", - "data_payments_address": "dp1", + "payment_vault_address": "dp1", "payment_token_address": "pt1", "rpc_url": "http://localhost:8545", }) @@ -90,7 +90,7 @@ func mockDaemon(t *testing.T) *httptest.Server { "payment_type": "wave_batch", "payments": []any{map[string]any{"quote_hash": "qh1", "rewards_address": "ra1", "amount": "100"}}, "total_amount": "100", - "data_payments_address": "dp1", + "payment_vault_address": "dp1", "payment_token_address": "pt1", "rpc_url": "http://localhost:8545", }) @@ -286,8 +286,8 @@ func TestPrepareUpload(t *testing.T) { if res.TotalAmount != "100" { t.Fatalf("unexpected total_amount: %s", res.TotalAmount) } - if res.DataPaymentsAddress != "dp1" { - t.Fatalf("unexpected data_payments_address: %s", res.DataPaymentsAddress) + if res.PaymentVaultAddress != "dp1" { + t.Fatalf("unexpected payment_vault_address: %s", res.PaymentVaultAddress) } if res.PaymentTokenAddress != "pt1" { t.Fatalf("unexpected payment_token_address: %s", res.PaymentTokenAddress) @@ -314,8 +314,8 @@ func TestPrepareDataUpload(t *testing.T) { if res.TotalAmount != "100" { t.Fatalf("unexpected total_amount: %s", res.TotalAmount) } - if res.DataPaymentsAddress != "dp1" { - t.Fatalf("unexpected data_payments_address: %s", res.DataPaymentsAddress) + if res.PaymentVaultAddress != "dp1" { + t.Fatalf("unexpected payment_vault_address: %s", res.PaymentVaultAddress) } if res.PaymentTokenAddress != "pt1" { t.Fatalf("unexpected payment_token_address: %s", res.PaymentTokenAddress) @@ -388,7 +388,7 @@ func mockMerkleDaemon(t *testing.T) *httptest.Server { }, }, "merkle_payment_timestamp": float64(1712150400), - "merkle_payments_address": "0xmerkle", + "payment_vault_address": "0xmerkle", "total_amount": "0", "payment_token_address": "0xtoken", "rpc_url": "http://localhost:8545", @@ -406,7 +406,7 @@ func mockMerkleDaemon(t *testing.T) *httptest.Server { }, }, "merkle_payment_timestamp": float64(1712150500), - "merkle_payments_address": "0xmerkle2", + "payment_vault_address": "0xmerkle2", "total_amount": "0", "payment_token_address": "0xtoken2", "rpc_url": "http://localhost:8546", @@ -446,8 +446,8 @@ func TestPrepareUploadMerkle(t *testing.T) { if res.MerklePaymentTimestamp != 1712150400 { t.Fatalf("unexpected timestamp: %d", res.MerklePaymentTimestamp) } - if res.MerklePaymentsAddress != "0xmerkle" { - t.Fatalf("unexpected merkle_payments_address: %s", res.MerklePaymentsAddress) + if res.PaymentVaultAddress != "0xmerkle" { + t.Fatalf("unexpected payment_vault_address: %s", res.PaymentVaultAddress) } if len(res.PoolCommitments) != 1 { t.Fatalf("expected 1 pool commitment, got %d", len(res.PoolCommitments)) @@ -488,8 +488,8 @@ func TestPrepareDataUploadMerkle(t *testing.T) { if res.Depth != 3 { t.Fatalf("unexpected depth: %d", res.Depth) } - if res.MerklePaymentsAddress != "0xmerkle2" { - t.Fatalf("unexpected merkle_payments_address: %s", res.MerklePaymentsAddress) + if res.PaymentVaultAddress != "0xmerkle2" { + t.Fatalf("unexpected payment_vault_address: %s", res.PaymentVaultAddress) } } @@ -517,7 +517,7 @@ func TestPrepareUploadBackwardCompat(t *testing.T) { "upload_id": "old1", "payments": []any{map[string]any{"quote_hash": "qh1", "rewards_address": "ra1", "amount": "50"}}, "total_amount": "50", - "data_payments_address": "dp_old", + "payment_vault_address": "dp_old", "payment_token_address": "pt_old", "rpc_url": "http://localhost:8545", }) diff --git a/antd-go/models.go b/antd-go/models.go index d57a316..78920ec 100644 --- a/antd-go/models.go +++ b/antd-go/models.go @@ -38,19 +38,18 @@ type PrepareUploadResult struct { PaymentType string `json:"payment_type"` // "wave_batch" or "merkle" // Wave-batch fields (present when PaymentType == "wave_batch") - Payments []PaymentInfo `json:"payments,omitempty"` // per-quote payments for payForQuotes() - DataPaymentsAddress string `json:"data_payments_address,omitempty"` // wave-batch contract address + Payments []PaymentInfo `json:"payments,omitempty"` // per-quote payments for payForQuotes() // Merkle fields (present when PaymentType == "merkle") - Depth int `json:"depth,omitempty"` // merkle tree depth (1-8) - PoolCommitments []PoolCommitmentEntry `json:"pool_commitments,omitempty"` // for payForMerkleTree() - MerklePaymentTimestamp uint64 `json:"merkle_payment_timestamp,omitempty"` // unix seconds - MerklePaymentsAddress string `json:"merkle_payments_address,omitempty"` // merkle vault contract + Depth int `json:"depth,omitempty"` // merkle tree depth (1-8) + PoolCommitments []PoolCommitmentEntry `json:"pool_commitments,omitempty"` // for payForMerkleTree() + MerklePaymentTimestamp uint64 `json:"merkle_payment_timestamp,omitempty"` // unix seconds // Common fields (always present) - TotalAmount string `json:"total_amount"` // total atto tokens ("0" for merkle) - PaymentTokenAddress string `json:"payment_token_address"` // token contract address - RPCUrl string `json:"rpc_url"` // EVM RPC URL + TotalAmount string `json:"total_amount"` // total atto tokens ("0" for merkle) + PaymentVaultAddress string `json:"payment_vault_address,omitempty"` // payment vault contract address + PaymentTokenAddress string `json:"payment_token_address"` // token contract address + RPCUrl string `json:"rpc_url"` // EVM RPC URL } // PoolCommitmentEntry describes a pool commitment for the merkle payment contract. diff --git a/antd-java/src/main/java/com/autonomi/antd/AntdClient.java b/antd-java/src/main/java/com/autonomi/antd/AntdClient.java index 3de5f64..1f5e214 100644 --- a/antd-java/src/main/java/com/autonomi/antd/AntdClient.java +++ b/antd-java/src/main/java/com/autonomi/antd/AntdClient.java @@ -340,13 +340,11 @@ private static PrepareUploadResult parsePrepareResponse(Map j) { Integer depth = null; List poolCommitments = null; Long merklePaymentTimestamp = null; - String merklePaymentsAddress = null; if ("merkle".equals(paymentType)) { long depthVal = num(j, "depth"); depth = (int) depthVal; merklePaymentTimestamp = num(j, "merkle_payment_timestamp"); - merklePaymentsAddress = str(j, "merkle_payments_address"); poolCommitments = new ArrayList<>(); for (Map pcm : listOfMaps(j, "pool_commitments")) { @@ -364,13 +362,12 @@ private static PrepareUploadResult parsePrepareResponse(Map j) { paymentType, Collections.unmodifiableList(payments), str(j, "total_amount"), - str(j, "data_payments_address"), + str(j, "payment_vault_address"), str(j, "payment_token_address"), str(j, "rpc_url"), depth, poolCommitments, - merklePaymentTimestamp, - merklePaymentsAddress + merklePaymentTimestamp ); } diff --git a/antd-java/src/main/java/com/autonomi/antd/models/PrepareUploadResult.java b/antd-java/src/main/java/com/autonomi/antd/models/PrepareUploadResult.java index 17c5987..b62b88c 100644 --- a/antd-java/src/main/java/com/autonomi/antd/models/PrepareUploadResult.java +++ b/antd-java/src/main/java/com/autonomi/antd/models/PrepareUploadResult.java @@ -11,23 +11,21 @@ * @param paymentType "wave_batch" or "merkle" * @param payments per-quote payments for payForQuotes() (wave_batch only) * @param totalAmount total atto tokens ("0" for merkle) - * @param dataPaymentsAddress wave-batch contract address (wave_batch only) + * @param paymentVaultAddress payment vault contract address * @param paymentTokenAddress payment token contract address * @param rpcUrl EVM RPC URL for submitting transactions * @param depth merkle tree depth 1-8 (merkle only) * @param poolCommitments pool commitments for payForMerkleTree() (merkle only) * @param merklePaymentTimestamp unix seconds timestamp (merkle only) - * @param merklePaymentsAddress merkle vault contract address (merkle only) */ public record PrepareUploadResult( String uploadId, String paymentType, List payments, String totalAmount, - String dataPaymentsAddress, + String paymentVaultAddress, String paymentTokenAddress, String rpcUrl, Integer depth, List poolCommitments, - Long merklePaymentTimestamp, - String merklePaymentsAddress) {} + Long merklePaymentTimestamp) {} diff --git a/antd-java/src/test/java/com/autonomi/antd/AntdClientTest.java b/antd-java/src/test/java/com/autonomi/antd/AntdClientTest.java index 3968a3e..ae7aed4 100644 --- a/antd-java/src/test/java/com/autonomi/antd/AntdClientTest.java +++ b/antd-java/src/test/java/com/autonomi/antd/AntdClientTest.java @@ -237,7 +237,7 @@ public MockResponse dispatch(RecordedRequest request) { + "\"candidates\":[{\"rewards_address\":\"0x1111\",\"amount\":\"500\"}," + "{\"rewards_address\":\"0x2222\",\"amount\":\"600\"}]}]," + "\"merkle_payment_timestamp\":1712150400," - + "\"merkle_payments_address\":\"0xmerkle\"," + + "\"payment_vault_address\":\"0xmerkle\"," + "\"total_amount\":\"0\"," + "\"payment_token_address\":\"0xtoken\"," + "\"rpc_url\":\"http://localhost:8545\"}" @@ -251,7 +251,7 @@ public MockResponse dispatch(RecordedRequest request) { + "\"depth\":3," + "\"pool_commitments\":[{\"pool_hash\":\"0xeeff\",\"candidates\":[]}]," + "\"merkle_payment_timestamp\":1712150500," - + "\"merkle_payments_address\":\"0xmerkle2\"," + + "\"payment_vault_address\":\"0xmerkle2\"," + "\"total_amount\":\"0\"," + "\"payment_token_address\":\"0xtoken2\"," + "\"rpc_url\":\"http://localhost:8546\"}" @@ -288,7 +288,7 @@ void testPrepareUploadMerkle() throws IOException { assertEquals("merkle", res.paymentType()); assertEquals(Integer.valueOf(5), res.depth()); assertEquals(Long.valueOf(1712150400L), res.merklePaymentTimestamp()); - assertEquals("0xmerkle", res.merklePaymentsAddress()); + assertEquals("0xmerkle", res.paymentVaultAddress()); assertEquals("0xtoken", res.paymentTokenAddress()); assertEquals("http://localhost:8545", res.rpcUrl()); assertEquals("0", res.totalAmount()); @@ -335,7 +335,7 @@ public MockResponse dispatch(RecordedRequest request) { "{\"upload_id\":\"old1\"," + "\"payments\":[{\"quote_hash\":\"qh1\",\"rewards_address\":\"ra1\",\"amount\":\"50\"}]," + "\"total_amount\":\"50\"," - + "\"data_payments_address\":\"dp_old\"," + + "\"payment_vault_address\":\"dp_old\"," + "\"payment_token_address\":\"pt_old\"," + "\"rpc_url\":\"http://localhost:8545\"}" ); @@ -358,7 +358,6 @@ public MockResponse dispatch(RecordedRequest request) { assertNull(res.depth()); assertNull(res.poolCommitments()); assertNull(res.merklePaymentTimestamp()); - assertNull(res.merklePaymentsAddress()); } } } diff --git a/antd-js/src/models.ts b/antd-js/src/models.ts index 18ac6ac..8e0dbd8 100644 --- a/antd-js/src/models.ts +++ b/antd-js/src/models.ts @@ -45,14 +45,13 @@ export interface PrepareUploadResult { uploadId: string; // hex identifier payments: PaymentInfo[]; totalAmount: string; - dataPaymentsAddress: string; // contract address + paymentVaultAddress: string; // payment vault contract address paymentTokenAddress: string; // token contract address rpcUrl: string; // EVM RPC URL paymentType: string; // "wave_batch" or "merkle" depth?: number; // merkle tree depth (merkle only) poolCommitments?: PoolCommitmentEntry[]; // pool commitments (merkle only) merklePaymentTimestamp?: number; // payment timestamp (merkle only) - merklePaymentsAddress?: string; // merkle contract address (merkle only) } /** Result of finalizing an externally-signed upload. */ diff --git a/antd-js/src/rest-client.test.ts b/antd-js/src/rest-client.test.ts index 5286d5b..61310ff 100644 --- a/antd-js/src/rest-client.test.ts +++ b/antd-js/src/rest-client.test.ts @@ -126,7 +126,7 @@ const routes: Route[] = [ { quote_hash: "0xq1", rewards_address: "0xr1", amount: "300" }, ], total_amount: "300", - data_payments_address: "0xdp", + payment_vault_address: "0xdp", payment_token_address: "0xpt", rpc_url: "http://rpc.local", }), @@ -143,7 +143,7 @@ const routes: Route[] = [ { quote_hash: "0xq2", rewards_address: "0xr2", amount: "150" }, ], total_amount: "150", - data_payments_address: "0xdp2", + payment_vault_address: "0xdp2", payment_token_address: "0xpt2", rpc_url: "http://rpc2.local", }), @@ -324,7 +324,7 @@ describe("RestClient", () => { { quoteHash: "0xq1", rewardsAddress: "0xr1", amount: "300" }, ], totalAmount: "300", - dataPaymentsAddress: "0xdp", + paymentVaultAddress: "0xdp", paymentTokenAddress: "0xpt", rpcUrl: "http://rpc.local", paymentType: "wave_batch", @@ -337,7 +337,7 @@ describe("RestClient", () => { expect(result.depth).toBeUndefined(); expect(result.poolCommitments).toBeUndefined(); expect(result.merklePaymentTimestamp).toBeUndefined(); - expect(result.merklePaymentsAddress).toBeUndefined(); + expect(result.paymentVaultAddress).toBeDefined(); }); it("parses merkle response fields", async () => { @@ -349,7 +349,7 @@ describe("RestClient", () => { upload_id: "uid-merkle", payments: [], total_amount: "500", - data_payments_address: "0xdp", + payment_vault_address: "0xmerkle", payment_token_address: "0xpt", rpc_url: "http://rpc.local", payment_type: "merkle", @@ -364,7 +364,6 @@ describe("RestClient", () => { }, ], merkle_payment_timestamp: 1700000000, - merkle_payments_address: "0xmerkle", }), ), ), @@ -374,7 +373,7 @@ describe("RestClient", () => { expect(result.paymentType).toBe("merkle"); expect(result.depth).toBe(3); expect(result.merklePaymentTimestamp).toBe(1700000000); - expect(result.merklePaymentsAddress).toBe("0xmerkle"); + expect(result.paymentVaultAddress).toBe("0xmerkle"); expect(result.poolCommitments).toEqual([ { poolHash: "0xpool1", diff --git a/antd-js/src/rest-client.ts b/antd-js/src/rest-client.ts index d9750b1..751c212 100644 --- a/antd-js/src/rest-client.ts +++ b/antd-js/src/rest-client.ts @@ -247,14 +247,13 @@ export class RestClient { upload_id: string; payments: { quote_hash: string; rewards_address: string; amount: string }[]; total_amount: string; - data_payments_address: string; + payment_vault_address: string; payment_token_address: string; rpc_url: string; payment_type?: string; depth?: number; pool_commitments?: { pool_hash: string; candidates: { rewards_address: string; amount: string }[] }[]; merkle_payment_timestamp?: number; - merkle_payments_address?: string; }>("/v1/upload/prepare", { path }); const result: PrepareUploadResult = { uploadId: j.upload_id, @@ -264,7 +263,7 @@ export class RestClient { amount: p.amount, })), totalAmount: j.total_amount, - dataPaymentsAddress: j.data_payments_address, + paymentVaultAddress: j.payment_vault_address, paymentTokenAddress: j.payment_token_address, rpcUrl: j.rpc_url, paymentType: j.payment_type ?? "wave_batch", @@ -280,7 +279,6 @@ export class RestClient { })); } if (j.merkle_payment_timestamp !== undefined) result.merklePaymentTimestamp = j.merkle_payment_timestamp; - if (j.merkle_payments_address !== undefined) result.merklePaymentsAddress = j.merkle_payments_address; return result; } @@ -290,14 +288,13 @@ export class RestClient { upload_id: string; payments: { quote_hash: string; rewards_address: string; amount: string }[]; total_amount: string; - data_payments_address: string; + payment_vault_address: string; payment_token_address: string; rpc_url: string; payment_type?: string; depth?: number; pool_commitments?: { pool_hash: string; candidates: { rewards_address: string; amount: string }[] }[]; merkle_payment_timestamp?: number; - merkle_payments_address?: string; }>("/v1/data/prepare", { data: RestClient.b64(data) }); const result: PrepareUploadResult = { uploadId: j.upload_id, @@ -307,7 +304,7 @@ export class RestClient { amount: p.amount, })), totalAmount: j.total_amount, - dataPaymentsAddress: j.data_payments_address, + paymentVaultAddress: j.payment_vault_address, paymentTokenAddress: j.payment_token_address, rpcUrl: j.rpc_url, paymentType: j.payment_type ?? "wave_batch", @@ -323,7 +320,6 @@ export class RestClient { })); } if (j.merkle_payment_timestamp !== undefined) result.merklePaymentTimestamp = j.merkle_payment_timestamp; - if (j.merkle_payments_address !== undefined) result.merklePaymentsAddress = j.merkle_payments_address; return result; } diff --git a/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/AntdRestClient.kt b/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/AntdRestClient.kt index 0ec8ec6..803c17d 100644 --- a/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/AntdRestClient.kt +++ b/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/AntdRestClient.kt @@ -259,14 +259,13 @@ class AntdRestClient( uploadId = resp.uploadId, payments = payments, totalAmount = resp.totalAmount, - dataPaymentsAddress = resp.dataPaymentsAddress, + paymentVaultAddress = resp.paymentVaultAddress, paymentTokenAddress = resp.paymentTokenAddress, rpcUrl = resp.rpcUrl, paymentType = resp.paymentType ?: "wave_batch", depth = resp.depth, poolCommitments = poolCommitments, merklePaymentTimestamp = resp.merklePaymentTimestamp, - merklePaymentsAddress = resp.merklePaymentsAddress, ) } } diff --git a/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/Models.kt b/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/Models.kt index 27488fc..72fa178 100644 --- a/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/Models.kt +++ b/antd-kotlin/lib/src/main/kotlin/com/autonomi/sdk/Models.kt @@ -33,14 +33,13 @@ data class PrepareUploadResult( val uploadId: String, val payments: List, val totalAmount: String, - val dataPaymentsAddress: String, + val paymentVaultAddress: String, val paymentTokenAddress: String, val rpcUrl: String, val paymentType: String = "wave_batch", val depth: Int? = null, val poolCommitments: List? = null, val merklePaymentTimestamp: Long? = null, - val merklePaymentsAddress: String? = null, ) /** Result of finalizing an externally-signed upload. */ @@ -119,14 +118,13 @@ internal data class PrepareUploadDto( @SerialName("upload_id") val uploadId: String, val payments: List? = null, @SerialName("total_amount") val totalAmount: String, - @SerialName("data_payments_address") val dataPaymentsAddress: String, + @SerialName("payment_vault_address") val paymentVaultAddress: String, @SerialName("payment_token_address") val paymentTokenAddress: String, @SerialName("rpc_url") val rpcUrl: String, @SerialName("payment_type") val paymentType: String? = null, val depth: Int? = null, @SerialName("pool_commitments") val poolCommitments: List? = null, @SerialName("merkle_payment_timestamp") val merklePaymentTimestamp: Long? = null, - @SerialName("merkle_payments_address") val merklePaymentsAddress: String? = null, ) @Serializable diff --git a/antd-lua/spec/client_spec.lua b/antd-lua/spec/client_spec.lua index 813165a..ea9c422 100644 --- a/antd-lua/spec/client_spec.lua +++ b/antd-lua/spec/client_spec.lua @@ -258,11 +258,10 @@ describe("antd client", function() depth = 3, total_amount = "5000", payments = {}, - data_payments_address = "0xDATA", + payment_vault_address = "0xMERKLE", payment_token_address = "0xTOKEN", rpc_url = "http://localhost:8545", merkle_payment_timestamp = 1700000000, - merkle_payments_address = "0xMERKLE", pool_commitments = { { pool_hash = "pool_abc", @@ -281,7 +280,7 @@ describe("antd client", function() assert.are.equal(3, result.depth) assert.are.equal("5000", result.total_amount) assert.are.equal(1700000000, result.merkle_payment_timestamp) - assert.are.equal("0xMERKLE", result.merkle_payments_address) + assert.are.equal("0xMERKLE", result.payment_vault_address) assert.are.equal(0, #result.payments) assert.are.equal(1, #result.pool_commitments) @@ -316,7 +315,7 @@ describe("antd client", function() { quote_hash = "qh1", rewards_address = "0xR1", amount = "100" }, }, total_amount = "100", - data_payments_address = "0xDATA", + payment_vault_address = "0xDATA", payment_token_address = "0xTOKEN", rpc_url = "http://localhost:8545", })) @@ -328,7 +327,6 @@ describe("antd client", function() assert.are.equal(0, result.depth) assert.are.equal(0, #result.pool_commitments) assert.are.equal(0, result.merkle_payment_timestamp) - assert.are.equal("", result.merkle_payments_address) assert.are.equal(1, #result.payments) assert.are.equal("qh1", result.payments[1].quote_hash) diff --git a/antd-lua/src/antd/client.lua b/antd-lua/src/antd/client.lua index e2bfc1b..a86e38e 100644 --- a/antd-lua/src/antd/client.lua +++ b/antd-lua/src/antd/client.lua @@ -178,14 +178,13 @@ local function build_prepare_result(j) upload_id = str(j, "upload_id"), payments = payments, total_amount = str(j, "total_amount"), - data_payments_address = str(j, "data_payments_address"), + payment_vault_address = str(j, "payment_vault_address"), payment_token_address = str(j, "payment_token_address"), rpc_url = str(j, "rpc_url"), payment_type = payment_type, depth = num(j, "depth"), pool_commitments = pool_commitments, merkle_payment_timestamp = num(j, "merkle_payment_timestamp"), - merkle_payments_address = str(j, "merkle_payments_address"), } end diff --git a/antd-mcp/src/antd_mcp/server.py b/antd-mcp/src/antd_mcp/server.py index d957588..5bbdb9f 100644 --- a/antd-mcp/src/antd_mcp/server.py +++ b/antd-mcp/src/antd_mcp/server.py @@ -414,10 +414,10 @@ def _prepare_result_to_dict(result) -> dict: "payment_token_address": result.payment_token_address, "rpc_url": result.rpc_url, } + d["payment_vault_address"] = result.payment_vault_address if result.payment_type == "merkle": d["depth"] = result.depth d["merkle_payment_timestamp"] = result.merkle_payment_timestamp - d["merkle_payments_address"] = result.merkle_payments_address d["pool_commitments"] = [ { "pool_hash": pc.pool_hash, @@ -429,7 +429,6 @@ def _prepare_result_to_dict(result) -> dict: for pc in result.pool_commitments ] else: - d["data_payments_address"] = result.data_payments_address d["payments"] = [ { "quote_hash": p.quote_hash, diff --git a/antd-php/src/AntdClient.php b/antd-php/src/AntdClient.php index c62139d..af081f9 100644 --- a/antd-php/src/AntdClient.php +++ b/antd-php/src/AntdClient.php @@ -627,7 +627,7 @@ public function fileCostAsync(string $path, bool $isPublic): PromiseInterface /** * Prepare a file upload for external signing. * - * @return array{upload_id: string, payments: array, total_amount: string, data_payments_address: string, payment_token_address: string, rpc_url: string} + * @return array{upload_id: string, payments: array, total_amount: string, payment_vault_address: string, payment_token_address: string, rpc_url: string} */ public function prepareUpload(string $path): array { @@ -636,7 +636,7 @@ public function prepareUpload(string $path): array 'upload_id' => $json['upload_id'] ?? '', 'payments' => $json['payments'] ?? [], 'total_amount' => $json['total_amount'] ?? '', - 'data_payments_address' => $json['data_payments_address'] ?? '', + 'payment_vault_address' => $json['payment_vault_address'] ?? '', 'payment_token_address' => $json['payment_token_address'] ?? '', 'rpc_url' => $json['rpc_url'] ?? '', ]; @@ -654,7 +654,7 @@ public function prepareUploadAsync(string $path): PromiseInterface 'upload_id' => $json['upload_id'] ?? '', 'payments' => $json['payments'] ?? [], 'total_amount' => $json['total_amount'] ?? '', - 'data_payments_address' => $json['data_payments_address'] ?? '', + 'payment_vault_address' => $json['payment_vault_address'] ?? '', 'payment_token_address' => $json['payment_token_address'] ?? '', 'rpc_url' => $json['rpc_url'] ?? '', ], @@ -666,7 +666,7 @@ public function prepareUploadAsync(string $path): PromiseInterface * Takes raw bytes, base64-encodes them, and POSTs to /v1/data/prepare. * * @param string $data Raw bytes to upload. - * @return array{upload_id: string, payments: array, total_amount: string, data_payments_address: string, payment_token_address: string, rpc_url: string} + * @return array{upload_id: string, payments: array, total_amount: string, payment_vault_address: string, payment_token_address: string, rpc_url: string} */ public function prepareDataUpload(string $data): array { @@ -675,7 +675,7 @@ public function prepareDataUpload(string $data): array 'upload_id' => $json['upload_id'] ?? '', 'payments' => $json['payments'] ?? [], 'total_amount' => $json['total_amount'] ?? '', - 'data_payments_address' => $json['data_payments_address'] ?? '', + 'payment_vault_address' => $json['payment_vault_address'] ?? '', 'payment_token_address' => $json['payment_token_address'] ?? '', 'rpc_url' => $json['rpc_url'] ?? '', ]; @@ -694,7 +694,7 @@ public function prepareDataUploadAsync(string $data): PromiseInterface 'upload_id' => $json['upload_id'] ?? '', 'payments' => $json['payments'] ?? [], 'total_amount' => $json['total_amount'] ?? '', - 'data_payments_address' => $json['data_payments_address'] ?? '', + 'payment_vault_address' => $json['payment_vault_address'] ?? '', 'payment_token_address' => $json['payment_token_address'] ?? '', 'rpc_url' => $json['rpc_url'] ?? '', ], diff --git a/antd-py/src/antd/_rest.py b/antd-py/src/antd/_rest.py index 7e22803..e21cd1f 100644 --- a/antd-py/src/antd/_rest.py +++ b/antd-py/src/antd/_rest.py @@ -73,14 +73,13 @@ def _parse_prepare_result(j: dict) -> PrepareUploadResult: upload_id=j.get("upload_id", ""), payments=payments, total_amount=j.get("total_amount", ""), - data_payments_address=j.get("data_payments_address", ""), + payment_vault_address=j.get("payment_vault_address", ""), payment_token_address=j.get("payment_token_address", ""), rpc_url=j.get("rpc_url", ""), payment_type=payment_type, depth=j.get("depth", 0), pool_commitments=pool_commitments, merkle_payment_timestamp=j.get("merkle_payment_timestamp", 0), - merkle_payments_address=j.get("merkle_payments_address", ""), ) diff --git a/antd-py/src/antd/models.py b/antd-py/src/antd/models.py index 265992a..93f03fb 100644 --- a/antd-py/src/antd/models.py +++ b/antd-py/src/antd/models.py @@ -59,14 +59,13 @@ class PrepareUploadResult: upload_id: str # hex identifier payments: list[PaymentInfo] = field(default_factory=list) total_amount: str = "" - data_payments_address: str = "" # contract address + payment_vault_address: str = "" # payment vault contract address payment_token_address: str = "" # token contract address rpc_url: str = "" # EVM RPC URL payment_type: str = "" # "wave_batch" or "merkle_batch" depth: int = 0 # merkle tree depth pool_commitments: list[PoolCommitmentEntry] = field(default_factory=list) merkle_payment_timestamp: int = 0 - merkle_payments_address: str = "" # merkle payments contract address @dataclass(frozen=True) diff --git a/antd-py/tests/test_rest_client.py b/antd-py/tests/test_rest_client.py index 23b82ba..e42a3d2 100644 --- a/antd-py/tests/test_rest_client.py +++ b/antd-py/tests/test_rest_client.py @@ -115,7 +115,7 @@ def do_POST(self): # noqa: N802 "payment_type": "merkle_batch", "payments": [], "total_amount": "5000", - "data_payments_address": "0xDP", + "payment_vault_address": "0xMERKLE", "payment_token_address": "0xTK", "rpc_url": "http://rpc.local", "depth": 3, @@ -129,7 +129,6 @@ def do_POST(self): # noqa: N802 }, ], "merkle_payment_timestamp": 1700000000, - "merkle_payments_address": "0xMERKLE", }) elif "compat" in req.get("path", ""): # Backward compat: no payment_type field @@ -139,7 +138,7 @@ def do_POST(self): # noqa: N802 {"quote_hash": "qh1", "rewards_address": "0xR1", "amount": "100"}, ], "total_amount": "100", - "data_payments_address": "0xDP", + "payment_vault_address": "0xDP", "payment_token_address": "0xTK", "rpc_url": "http://rpc.local", }) @@ -151,7 +150,7 @@ def do_POST(self): # noqa: N802 {"quote_hash": "qh1", "rewards_address": "0xR1", "amount": "100"}, ], "total_amount": "100", - "data_payments_address": "0xDP", + "payment_vault_address": "0xDP", "payment_token_address": "0xTK", "rpc_url": "http://rpc.local", }) @@ -277,7 +276,7 @@ def test_prepare_upload_merkle(self, client: RestClient): assert result.depth == 3 assert result.total_amount == "5000" assert result.merkle_payment_timestamp == 1700000000 - assert result.merkle_payments_address == "0xMERKLE" + assert result.payment_vault_address == "0xMERKLE" # pool_commitments assert len(result.pool_commitments) == 1 pc = result.pool_commitments[0] @@ -323,7 +322,7 @@ def test_prepare_upload_backward_compat(self, client: RestClient): assert result.depth == 0 assert result.pool_commitments == [] assert result.merkle_payment_timestamp == 0 - assert result.merkle_payments_address == "" + assert result.payment_vault_address == "0xDP" # wave_batch payments should still be parsed assert len(result.payments) == 1 assert result.payments[0].quote_hash == "qh1" diff --git a/antd-ruby/lib/antd/client.rb b/antd-ruby/lib/antd/client.rb index c325c8c..f894866 100644 --- a/antd-ruby/lib/antd/client.rb +++ b/antd-ruby/lib/antd/client.rb @@ -258,14 +258,13 @@ def parse_prepare_response(j) upload_id: j["upload_id"] || "", payments: payments, total_amount: j["total_amount"] || "", - data_payments_address: j["data_payments_address"] || "", + payment_vault_address: j["payment_vault_address"] || "", payment_token_address: j["payment_token_address"] || "", rpc_url: j["rpc_url"] || "", payment_type: payment_type, depth: j["depth"] || 0, pool_commitments: pool_commitments, - merkle_payment_timestamp: j["merkle_payment_timestamp"] || 0, - merkle_payments_address: j["merkle_payments_address"] || "" + merkle_payment_timestamp: j["merkle_payment_timestamp"] || 0 ) end diff --git a/antd-ruby/lib/antd/models.rb b/antd-ruby/lib/antd/models.rb index 1e45b3d..69d5d56 100644 --- a/antd-ruby/lib/antd/models.rb +++ b/antd-ruby/lib/antd/models.rb @@ -25,9 +25,9 @@ module Antd # Result of preparing an upload for external signing. PrepareUploadResult = Struct.new( :upload_id, :payments, :total_amount, - :data_payments_address, :payment_token_address, :rpc_url, + :payment_vault_address, :payment_token_address, :rpc_url, :payment_type, :depth, :pool_commitments, - :merkle_payment_timestamp, :merkle_payments_address, + :merkle_payment_timestamp, keyword_init: true ) diff --git a/antd-ruby/test/test_client.rb b/antd-ruby/test/test_client.rb index 45153ee..9f9e7e0 100644 --- a/antd-ruby/test/test_client.rb +++ b/antd-ruby/test/test_client.rb @@ -155,11 +155,10 @@ def test_prepare_upload_merkle depth: 3, total_amount: "5000", payments: [], - data_payments_address: "0xDATA", + payment_vault_address: "0xMERKLE", payment_token_address: "0xTOKEN", rpc_url: "http://localhost:8545", merkle_payment_timestamp: 1700000000, - merkle_payments_address: "0xMERKLE", pool_commitments: [ { pool_hash: "pool_abc", @@ -182,7 +181,7 @@ def test_prepare_upload_merkle assert_equal 3, result.depth assert_equal "5000", result.total_amount assert_equal 1700000000, result.merkle_payment_timestamp - assert_equal "0xMERKLE", result.merkle_payments_address + assert_equal "0xMERKLE", result.payment_vault_address assert_equal [], result.payments assert_equal 1, result.pool_commitments.length @@ -215,7 +214,7 @@ def test_prepare_upload_backward_compat { quote_hash: "qh1", rewards_address: "0xR1", amount: "100" } ], total_amount: "100", - data_payments_address: "0xDATA", + payment_vault_address: "0xDATA", payment_token_address: "0xTOKEN", rpc_url: "http://localhost:8545" }.to_json @@ -231,7 +230,7 @@ def test_prepare_upload_backward_compat assert_equal 0, result.depth assert_equal [], result.pool_commitments assert_equal 0, result.merkle_payment_timestamp - assert_equal "", result.merkle_payments_address + assert_equal "0xDATA", result.payment_vault_address assert_equal 1, result.payments.length assert_equal "qh1", result.payments[0].quote_hash diff --git a/antd-rust/src/client.rs b/antd-rust/src/client.rs index 5ef522b..3707feb 100644 --- a/antd-rust/src/client.rs +++ b/antd-rust/src/client.rs @@ -434,7 +434,7 @@ impl Client { upload_id: Self::str_field(&j, "upload_id"), payments, total_amount: Self::str_field(&j, "total_amount"), - data_payments_address: Self::str_field(&j, "data_payments_address"), + payment_vault_address: Self::str_field(&j, "payment_vault_address"), payment_token_address: Self::str_field(&j, "payment_token_address"), rpc_url: Self::str_field(&j, "rpc_url"), payment_type: Self::str_field(&j, "payment_type"), @@ -459,7 +459,6 @@ impl Client { .collect() }), merkle_payment_timestamp: j.get("merkle_payment_timestamp").and_then(|v| v.as_u64()), - merkle_payments_address: j.get("merkle_payments_address").and_then(|v| v.as_str()).map(|s| s.to_string()), }) } @@ -493,7 +492,7 @@ impl Client { upload_id: Self::str_field(&j, "upload_id"), payments, total_amount: Self::str_field(&j, "total_amount"), - data_payments_address: Self::str_field(&j, "data_payments_address"), + payment_vault_address: Self::str_field(&j, "payment_vault_address"), payment_token_address: Self::str_field(&j, "payment_token_address"), rpc_url: Self::str_field(&j, "rpc_url"), payment_type: Self::str_field(&j, "payment_type"), @@ -518,7 +517,6 @@ impl Client { .collect() }), merkle_payment_timestamp: j.get("merkle_payment_timestamp").and_then(|v| v.as_u64()), - merkle_payments_address: j.get("merkle_payments_address").and_then(|v| v.as_str()).map(|s| s.to_string()), }) } diff --git a/antd-rust/src/models.rs b/antd-rust/src/models.rs index 5e01d9a..3499d65 100644 --- a/antd-rust/src/models.rs +++ b/antd-rust/src/models.rs @@ -70,8 +70,8 @@ pub struct PrepareUploadResult { pub payments: Vec, /// Total amount across all payments. pub total_amount: String, - /// Data payments contract address. - pub data_payments_address: String, + /// Payment vault contract address. + pub payment_vault_address: String, /// Payment token contract address. pub payment_token_address: String, /// EVM RPC URL for submitting transactions. @@ -88,9 +88,6 @@ pub struct PrepareUploadResult { /// Timestamp for merkle payment submission. #[serde(rename = "merkle_payment_timestamp", default)] pub merkle_payment_timestamp: Option, - /// Contract address for merkle payments. - #[serde(rename = "merkle_payments_address", default)] - pub merkle_payments_address: Option, } /// Result of finalizing an externally-signed upload. diff --git a/antd-rust/src/tests.rs b/antd-rust/src/tests.rs index 1ca4f28..99bf0de 100644 --- a/antd-rust/src/tests.rs +++ b/antd-rust/src/tests.rs @@ -139,7 +139,7 @@ fn mock_prepare_upload_merkle(server: &mut ServerGuard) -> Mock { "upload_id": "up123", "payments": [], "total_amount": "5000", - "data_payments_address": "0xDP", + "payment_vault_address": "0xMP", "payment_token_address": "0xPT", "rpc_url": "http://rpc.local", "payment_type": "merkle", @@ -159,8 +159,7 @@ fn mock_prepare_upload_merkle(server: &mut ServerGuard) -> Mock { ] } ], - "merkle_payment_timestamp": 1700000000, - "merkle_payments_address": "0xMP" + "merkle_payment_timestamp": 1700000000 }"#) .create() } @@ -186,7 +185,7 @@ fn mock_prepare_upload_legacy(server: &mut ServerGuard) -> Mock { "upload_id": "up_old", "payments": [{"quote_hash":"qh1","rewards_address":"0xr1","amount":"100"}], "total_amount": "100", - "data_payments_address": "0xDP", + "payment_vault_address": "0xDP", "payment_token_address": "0xPT", "rpc_url": "http://rpc.local" }"#) @@ -477,7 +476,7 @@ async fn test_prepare_upload_merkle() { assert_eq!(result.total_amount, "5000"); assert_eq!(result.depth, Some(4)); assert_eq!(result.merkle_payment_timestamp, Some(1700000000)); - assert_eq!(result.merkle_payments_address.as_deref(), Some("0xMP")); + assert_eq!(result.payment_vault_address, "0xMP"); let pools = result.pool_commitments.unwrap(); assert_eq!(pools.len(), 2); @@ -518,7 +517,7 @@ async fn test_prepare_upload_backward_compat() { assert_eq!(result.depth, None); assert!(result.pool_commitments.is_none()); assert!(result.merkle_payment_timestamp.is_none()); - assert!(result.merkle_payments_address.is_none()); + assert_eq!(result.payment_vault_address, "0xDP"); assert_eq!(result.payments.len(), 1); assert_eq!(result.payments[0].quote_hash, "qh1"); } diff --git a/antd-swift/Sources/AntdSdk/AntdRestClient.swift b/antd-swift/Sources/AntdSdk/AntdRestClient.swift index 7078bd9..c77ef4e 100644 --- a/antd-swift/Sources/AntdSdk/AntdRestClient.swift +++ b/antd-swift/Sources/AntdSdk/AntdRestClient.swift @@ -213,14 +213,13 @@ public final class AntdRestClient: AntdClientProtocol, @unchecked Sendable { uploadId: resp.uploadId, payments: payments, totalAmount: resp.totalAmount, - dataPaymentsAddress: resp.dataPaymentsAddress, + paymentVaultAddress: resp.paymentVaultAddress, paymentTokenAddress: resp.paymentTokenAddress, rpcUrl: resp.rpcUrl, paymentType: resp.paymentType ?? "wave_batch", depth: resp.depth, poolCommitments: poolCommitments, - merklePaymentTimestamp: resp.merklePaymentTimestamp, - merklePaymentsAddress: resp.merklePaymentsAddress + merklePaymentTimestamp: resp.merklePaymentTimestamp ) } } @@ -283,14 +282,13 @@ private struct PrepareUploadDTO: Decodable { let uploadId: String let payments: [PaymentInfoDTO]? let totalAmount: String - let dataPaymentsAddress: String + let paymentVaultAddress: String let paymentTokenAddress: String let rpcUrl: String let paymentType: String? let depth: Int? let poolCommitments: [PoolCommitmentEntryDTO]? let merklePaymentTimestamp: UInt64? - let merklePaymentsAddress: String? } private struct FinalizeUploadDTO: Decodable { diff --git a/antd-swift/Sources/AntdSdk/Models.swift b/antd-swift/Sources/AntdSdk/Models.swift index 39429e7..c74f9d5 100644 --- a/antd-swift/Sources/AntdSdk/Models.swift +++ b/antd-swift/Sources/AntdSdk/Models.swift @@ -85,7 +85,7 @@ public struct PrepareUploadResult: Sendable, Equatable { public let uploadId: String public let payments: [PaymentInfo] public let totalAmount: String - public let dataPaymentsAddress: String + public let paymentVaultAddress: String public let paymentTokenAddress: String public let rpcUrl: String @@ -101,21 +101,17 @@ public struct PrepareUploadResult: Sendable, Equatable { /// Unix timestamp for merkle payment. Present when `paymentType == "merkle"`. public let merklePaymentTimestamp: UInt64? - /// Merkle vault contract address. Present when `paymentType == "merkle"`. - public let merklePaymentsAddress: String? - - public init(uploadId: String, payments: [PaymentInfo], totalAmount: String, dataPaymentsAddress: String, paymentTokenAddress: String, rpcUrl: String, paymentType: String = "wave_batch", depth: Int? = nil, poolCommitments: [PoolCommitmentEntry]? = nil, merklePaymentTimestamp: UInt64? = nil, merklePaymentsAddress: String? = nil) { + public init(uploadId: String, payments: [PaymentInfo], totalAmount: String, paymentVaultAddress: String, paymentTokenAddress: String, rpcUrl: String, paymentType: String = "wave_batch", depth: Int? = nil, poolCommitments: [PoolCommitmentEntry]? = nil, merklePaymentTimestamp: UInt64? = nil) { self.uploadId = uploadId self.payments = payments self.totalAmount = totalAmount - self.dataPaymentsAddress = dataPaymentsAddress + self.paymentVaultAddress = paymentVaultAddress self.paymentTokenAddress = paymentTokenAddress self.rpcUrl = rpcUrl self.paymentType = paymentType self.depth = depth self.poolCommitments = poolCommitments self.merklePaymentTimestamp = merklePaymentTimestamp - self.merklePaymentsAddress = merklePaymentsAddress } } diff --git a/antd/README.md b/antd/README.md index 568b3a0..2b4babb 100644 --- a/antd/README.md +++ b/antd/README.md @@ -23,7 +23,7 @@ ANTD_PEERS="/ip4/..." \ AUTONOMI_WALLET_KEY="hex_key" \ EVM_RPC_URL="http://127.0.0.1:8545" \ EVM_PAYMENT_TOKEN_ADDRESS="0x..." \ -EVM_DATA_PAYMENTS_ADDRESS="0x..." \ +EVM_PAYMENT_VAULT_ADDRESS="0x..." \ cargo run -- --network local # With dynamic ports (for managed mode / port discovery) @@ -60,8 +60,7 @@ All options can be set via CLI flags or environment variables: | `AUTONOMI_WALLET_KEY` | Hex-encoded wallet private key for payments (direct wallet mode) | | `EVM_RPC_URL` | EVM JSON-RPC endpoint (default: `http://127.0.0.1:8545`) | | `EVM_PAYMENT_TOKEN_ADDRESS` | Payment token contract address | -| `EVM_DATA_PAYMENTS_ADDRESS` | Data payments contract address | -| `EVM_MERKLE_PAYMENTS_ADDRESS` | Merkle batch payments contract address (optional) | +| `EVM_PAYMENT_VAULT_ADDRESS` | Payment vault contract address | antd supports two wallet modes: - **Direct wallet**: Set `AUTONOMI_WALLET_KEY` — antd signs payment transactions internally diff --git a/antd/openapi.yaml b/antd/openapi.yaml index 9556e18..aba6e2d 100644 --- a/antd/openapi.yaml +++ b/antd/openapi.yaml @@ -2,7 +2,7 @@ openapi: 3.1.0 info: title: antd REST API description: REST API for the antd daemon — gateway to the Autonomi network. - version: 1.0.0 + version: 2.0.0 servers: - url: http://localhost:8082 @@ -718,7 +718,7 @@ components: PrepareUploadResponse: type: object - required: [upload_id, payment_type, total_amount, payment_token_address, rpc_url] + required: [upload_id, payment_type, total_amount, payment_vault_address, payment_token_address, rpc_url] properties: upload_id: type: string @@ -736,9 +736,6 @@ components: items: $ref: "#/components/schemas/PaymentEntry" description: Per-quote payment entries for payForQuotes() (wave_batch only) - data_payments_address: - type: string - description: Data payments contract address (wave_batch only) # -- Merkle fields (present when payment_type == "merkle") -- depth: type: integer @@ -752,15 +749,15 @@ components: type: integer format: int64 description: Unix timestamp for the merkle payment (merkle only) - merkle_payments_address: - type: string - description: Merkle payment vault contract address (merkle only) # -- Common fields -- total_amount: type: string description: >- Total amount to pay (atto tokens as decimal string). For merkle this is "0" since cost is determined on-chain. + payment_vault_address: + type: string + description: Payment vault contract address (hex with 0x prefix) payment_token_address: type: string description: Payment token contract address (hex with 0x prefix) diff --git a/antd/src/main.rs b/antd/src/main.rs index b7f9048..9ba5e08 100644 --- a/antd/src/main.rs +++ b/antd/src/main.rs @@ -165,12 +165,14 @@ async fn main() -> Result<(), Box> { let rpc_url = std::env::var("EVM_RPC_URL").unwrap_or_else(|_| "http://127.0.0.1:8545".to_string()); let token_addr = std::env::var("EVM_PAYMENT_TOKEN_ADDRESS").unwrap_or_default(); - let payments_addr = std::env::var("EVM_DATA_PAYMENTS_ADDRESS").unwrap_or_default(); + let payments_addr = std::env::var("EVM_PAYMENT_VAULT_ADDRESS") + .or_else(|_| std::env::var("EVM_DATA_PAYMENTS_ADDRESS")) + .unwrap_or_default(); if token_addr.is_empty() { tracing::warn!("EVM_PAYMENT_TOKEN_ADDRESS is empty — payments may fail"); } if payments_addr.is_empty() { - tracing::warn!("EVM_DATA_PAYMENTS_ADDRESS is empty — payments may fail"); + tracing::warn!("EVM_PAYMENT_VAULT_ADDRESS is empty — payments may fail"); } tracing::info!(%rpc_url, "loading EVM wallet..."); let network = evmlib::Network::new_custom(&rpc_url, &token_addr, &payments_addr); @@ -189,7 +191,9 @@ async fn main() -> Result<(), Box> { let rpc_url = std::env::var("EVM_RPC_URL").ok(); if let Some(rpc_url) = rpc_url { let token_addr = std::env::var("EVM_PAYMENT_TOKEN_ADDRESS").unwrap_or_default(); - let payments_addr = std::env::var("EVM_DATA_PAYMENTS_ADDRESS").unwrap_or_default(); + let payments_addr = std::env::var("EVM_PAYMENT_VAULT_ADDRESS") + .or_else(|_| std::env::var("EVM_DATA_PAYMENTS_ADDRESS")) + .unwrap_or_default(); let network = evmlib::Network::new_custom(&rpc_url, &token_addr, &payments_addr); client = client.with_evm_network(network); tracing::info!(%rpc_url, "EVM network configured (external signer mode)"); diff --git a/antd/src/rest/upload.rs b/antd/src/rest/upload.rs index 66c8746..6cc181f 100644 --- a/antd/src/rest/upload.rs +++ b/antd/src/rest/upload.rs @@ -17,6 +17,9 @@ fn build_prepare_response( let rpc_url = std::env::var("EVM_RPC_URL").unwrap_or_else(|_| "http://127.0.0.1:8545".to_string()); let payment_token_address = std::env::var("EVM_PAYMENT_TOKEN_ADDRESS").unwrap_or_default(); + let payment_vault_address = std::env::var("EVM_PAYMENT_VAULT_ADDRESS") + .or_else(|_| std::env::var("EVM_DATA_PAYMENTS_ADDRESS")) + .unwrap_or_default(); match &prepared.payment_info { ant_core::data::ExternalPaymentInfo::WaveBatch { payment_intent, .. } => { @@ -30,27 +33,20 @@ fn build_prepare_response( }) .collect(); - let data_payments_address = - std::env::var("EVM_DATA_PAYMENTS_ADDRESS").unwrap_or_default(); - Ok(PrepareUploadResponse { upload_id, payment_type: "wave_batch".into(), payments, - data_payments_address: Some(data_payments_address), depth: None, pool_commitments: None, merkle_payment_timestamp: None, - merkle_payments_address: None, total_amount: payment_intent.total_amount.to_string(), + payment_vault_address, payment_token_address, rpc_url, }) } ant_core::data::ExternalPaymentInfo::Merkle { prepared_batch, .. } => { - let merkle_payments_address = - std::env::var("EVM_MERKLE_PAYMENTS_ADDRESS").unwrap_or_default(); - // Serialize pool commitments for JSON response. // Each candidate has rewards_address + price (maps to contract's amount). let pool_commitments: Vec = prepared_batch @@ -73,12 +69,11 @@ fn build_prepare_response( upload_id, payment_type: "merkle".into(), payments: vec![], - data_payments_address: None, depth: Some(prepared_batch.depth), pool_commitments: Some(pool_commitments), merkle_payment_timestamp: Some(prepared_batch.merkle_payment_timestamp), - merkle_payments_address: Some(merkle_payments_address), total_amount: "0".into(), + payment_vault_address, payment_token_address, rpc_url, }) diff --git a/antd/src/types.rs b/antd/src/types.rs index 9c8f61a..9ed4946 100644 --- a/antd/src/types.rs +++ b/antd/src/types.rs @@ -82,9 +82,6 @@ pub struct PrepareUploadResponse { /// Per-quote payment entries for `payForQuotes()`. #[serde(skip_serializing_if = "Vec::is_empty")] pub payments: Vec, - /// Data payments contract address (wave-batch only). - #[serde(skip_serializing_if = "Option::is_none")] - pub data_payments_address: Option, // --- Merkle fields (present when payment_type == "merkle") --- /// Merkle tree depth (1-8). @@ -96,14 +93,13 @@ pub struct PrepareUploadResponse { /// Timestamp for the merkle payment (unix seconds). #[serde(skip_serializing_if = "Option::is_none")] pub merkle_payment_timestamp: Option, - /// Merkle payment vault contract address. - #[serde(skip_serializing_if = "Option::is_none")] - pub merkle_payments_address: Option, // --- Common fields (always present) --- /// Total amount to pay (atto tokens as decimal string). /// For merkle this is "0" since cost is determined on-chain. pub total_amount: String, + /// Unified payment vault contract address (hex with 0x prefix). + pub payment_vault_address: String, /// Payment token contract address (hex with 0x prefix). pub payment_token_address: String, /// EVM RPC URL for submitting transactions. @@ -279,24 +275,22 @@ mod tests { rewards_address: "0xbb".into(), amount: "100".into(), }], - data_payments_address: Some("0xcc".into()), depth: None, pool_commitments: None, merkle_payment_timestamp: None, - merkle_payments_address: None, total_amount: "100".into(), + payment_vault_address: "0xcc".into(), payment_token_address: "0xdd".into(), rpc_url: "http://localhost:8545".into(), }; let json = serde_json::to_value(&resp).unwrap(); assert_eq!(json["payment_type"], "wave_batch"); assert_eq!(json["payments"][0]["quote_hash"], "0xaa"); - assert_eq!(json["data_payments_address"], "0xcc"); + assert_eq!(json["payment_vault_address"], "0xcc"); // Merkle fields must be absent assert!(json.get("depth").is_none()); assert!(json.get("pool_commitments").is_none()); assert!(json.get("merkle_payment_timestamp").is_none()); - assert!(json.get("merkle_payments_address").is_none()); } #[test] @@ -305,7 +299,6 @@ mod tests { upload_id: "def456".into(), payment_type: "merkle".into(), payments: vec![], - data_payments_address: None, depth: Some(5), pool_commitments: Some(vec![PoolCommitmentEntry { pool_hash: "0xaabb".into(), @@ -315,8 +308,8 @@ mod tests { }], }]), merkle_payment_timestamp: Some(1712150400), - merkle_payments_address: Some("0xee".into()), total_amount: "0".into(), + payment_vault_address: "0xee".into(), payment_token_address: "0xdd".into(), rpc_url: "http://localhost:8545".into(), }; @@ -325,10 +318,9 @@ mod tests { assert_eq!(json["depth"], 5); assert_eq!(json["merkle_payment_timestamp"], 1712150400u64); assert_eq!(json["pool_commitments"][0]["pool_hash"], "0xaabb"); - assert_eq!(json["merkle_payments_address"], "0xee"); + assert_eq!(json["payment_vault_address"], "0xee"); // Wave fields must be absent assert!(json.get("payments").is_none()); - assert!(json.get("data_payments_address").is_none()); } #[test] diff --git a/ffi/rust/ant-ffi/Cargo.toml b/ffi/rust/ant-ffi/Cargo.toml index 6f01564..b5a8e66 100644 --- a/ffi/rust/ant-ffi/Cargo.toml +++ b/ffi/rust/ant-ffi/Cargo.toml @@ -8,7 +8,7 @@ crate-type = ["cdylib", "staticlib", "lib"] [dependencies] ant-core = { git = "https://github.com/WithAutonomi/ant-client" } -evmlib = "0.5.0" +evmlib = "0.8.0" bytes = "1" hex = "0.4" rand = "0.8" diff --git a/ffi/rust/ant-ffi/src/client.rs b/ffi/rust/ant-ffi/src/client.rs index a4d661a..505ed51 100644 --- a/ffi/rust/ant-ffi/src/client.rs +++ b/ffi/rust/ant-ffi/src/client.rs @@ -121,7 +121,7 @@ impl Client { mut private_key: String, rpc_url: String, payment_token_address: String, - data_payments_address: String, + payment_vault_address: String, ) -> Result, ClientError> { let mut builder = CoreNodeConfig::builder() .mode(NodeMode::Client) @@ -164,7 +164,7 @@ impl Client { let network = evmlib::Network::new_custom( &rpc_url, &payment_token_address, - &data_payments_address, + &payment_vault_address, None, ); let result = evmlib::wallet::Wallet::new_from_private_key(network, &private_key); diff --git a/ffi/rust/ant-ffi/src/wallet.rs b/ffi/rust/ant-ffi/src/wallet.rs index 9bfa88b..a6c051e 100644 --- a/ffi/rust/ant-ffi/src/wallet.rs +++ b/ffi/rust/ant-ffi/src/wallet.rs @@ -20,12 +20,12 @@ impl Wallet { mut private_key: String, rpc_url: String, payment_token_address: String, - data_payments_address: String, + payment_vault_address: String, ) -> Result, WalletError> { let network = evmlib::Network::new_custom( &rpc_url, &payment_token_address, - &data_payments_address, + &payment_vault_address, None, ); let result = evmlib::wallet::Wallet::new_from_private_key(network, &private_key); diff --git a/llms-full.txt b/llms-full.txt index de5926b..1e69b04 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -332,7 +332,7 @@ The response includes a `payment_type` discriminator that determines the payment { "quote_hash": "0x...", "rewards_address": "0x...", "amount": "123" } ], "total_amount": "456", - "data_payments_address": "0x...", + "payment_vault_address": "0x...", "payment_token_address": "0x...", "rpc_url": "http://..." } @@ -353,7 +353,7 @@ The response includes a `payment_type` discriminator that determines the payment } ], "merkle_payment_timestamp": 1712150400, - "merkle_payments_address": "0x...", + "payment_vault_address": "0x...", "total_amount": "0", "payment_token_address": "0x...", "rpc_url": "http://..." diff --git a/scripts/start-local.ps1 b/scripts/start-local.ps1 index 67e8775..754dabe 100644 --- a/scripts/start-local.ps1 +++ b/scripts/start-local.ps1 @@ -89,8 +89,7 @@ $bootstrapPeers = ($manifest.bootstrap -join ",") $walletKey = $manifest.evm.wallet_private_key -replace '^0x', '' $evmRpcUrl = $manifest.evm.rpc_url $evmTokenAddr = $manifest.evm.payment_token_address -$evmPaymentsAddr = $manifest.evm.data_payments_address -$evmMerkleAddr = if ($manifest.evm.merkle_payments_address) { $manifest.evm.merkle_payments_address } else { "" } +$evmVaultAddr = if ($manifest.evm.payment_vault_address) { $manifest.evm.payment_vault_address } elseif ($manifest.evm.data_payments_address) { $manifest.evm.data_payments_address } else { "" } Write-Host " Devnet ready: $($manifest.node_count) nodes, base port $($manifest.base_port)" -ForegroundColor Green Write-Host " EVM: $evmRpcUrl" -ForegroundColor Green @@ -102,8 +101,7 @@ $antdEnv = @{ AUTONOMI_WALLET_KEY = $walletKey EVM_RPC_URL = $evmRpcUrl EVM_PAYMENT_TOKEN_ADDRESS = $evmTokenAddr - EVM_DATA_PAYMENTS_ADDRESS = $evmPaymentsAddr - EVM_MERKLE_PAYMENTS_ADDRESS = $evmMerkleAddr + EVM_PAYMENT_VAULT_ADDRESS = $evmVaultAddr } # Merge with current environment $mergedEnv = [System.Collections.Generic.Dictionary[string,string]]::new() diff --git a/scripts/start-local.sh b/scripts/start-local.sh index e7d0a5f..5723a8f 100644 --- a/scripts/start-local.sh +++ b/scripts/start-local.sh @@ -98,8 +98,7 @@ print(k[2:] if k.startswith('0x') else k) EVM_RPC_URL=$(python -c "import json; print(json.load(open('$MANIFEST_FILE'))['evm']['rpc_url'])" 2>/dev/null) EVM_TOKEN_ADDR=$(python -c "import json; print(json.load(open('$MANIFEST_FILE'))['evm']['payment_token_address'])" 2>/dev/null) -EVM_PAYMENTS_ADDR=$(python -c "import json; print(json.load(open('$MANIFEST_FILE'))['evm']['data_payments_address'])" 2>/dev/null) -EVM_MERKLE_ADDR=$(python -c "import json; print(json.load(open('$MANIFEST_FILE'))['evm'].get('merkle_payments_address', ''))" 2>/dev/null) +EVM_VAULT_ADDR=$(python -c "import json; e=json.load(open('$MANIFEST_FILE'))['evm']; print(e.get('payment_vault_address', e.get('data_payments_address', '')))" 2>/dev/null) NODE_COUNT=$(python -c "import json; print(json.load(open('$MANIFEST_FILE')).get('node_count', '?'))" 2>/dev/null) BASE_PORT=$(python -c "import json; print(json.load(open('$MANIFEST_FILE')).get('base_port', '?'))" 2>/dev/null) @@ -113,8 +112,7 @@ echo -e "${YELLOW}[2/3] Starting antd...${NC}" AUTONOMI_WALLET_KEY="$WALLET_KEY" \ EVM_RPC_URL="$EVM_RPC_URL" \ EVM_PAYMENT_TOKEN_ADDRESS="$EVM_TOKEN_ADDR" \ - EVM_DATA_PAYMENTS_ADDRESS="$EVM_PAYMENTS_ADDR" \ - EVM_MERKLE_PAYMENTS_ADDRESS="$EVM_MERKLE_ADDR" \ + EVM_PAYMENT_VAULT_ADDRESS="$EVM_VAULT_ADDR" \ cargo run -- --network local 2>&1) & ANTD_PID=$! diff --git a/scripts/test-api.sh b/scripts/test-api.sh index 3478441..8d7e02a 100644 --- a/scripts/test-api.sh +++ b/scripts/test-api.sh @@ -1,10 +1,12 @@ #!/usr/bin/env bash set -uo pipefail -## REST API integration tests using only curl + jq. -## Zero dependencies beyond standard Unix tools. +## REST API integration tests using curl + jq. ## -## Prerequisite: antd running on local testnet (./scripts/start-local.sh) +## Prerequisites: +## - curl +## - jq (https://jqlang.github.io/jq/ — install via: apt install jq / brew install jq / choco install jq) +## - antd running on local testnet (./scripts/start-local.sh) ## ## Currently tests health + chunks (working with ant-node). ## Data, files, and private data are not yet implemented. diff --git a/skill.md b/skill.md index f884676..4fc862a 100644 --- a/skill.md +++ b/skill.md @@ -100,14 +100,14 @@ prep = client.prepare_upload("/path/to/file") if prep.payment_type == "wave_batch": # Small files (< 64 chunks): call payForQuotes() with per-quote payments - # prep.payments, prep.data_payments_address, prep.total_amount + # prep.payments, prep.payment_vault_address, prep.total_amount # ... external signer submits EVM payForQuotes() transaction ... result = client.finalize_upload(prep.upload_id, {"0xquotehash": "0xtxhash", ...}) elif prep.payment_type == "merkle": # Large files (>= 64 chunks): call payForMerkleTree() — gas-efficient batch # prep.depth, prep.pool_commitments, prep.merkle_payment_timestamp, - # prep.merkle_payments_address + # prep.payment_vault_address # ... external signer submits EVM payForMerkleTree() transaction ... # ... extract winner_pool_hash from MerklePaymentMade event ... result = client.finalize_merkle_upload(prep.upload_id, "0xwinnerpoolhash")