Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions packages/dapi-grpc/protos/platform/v0/platform.proto
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ service Platform {
returns (GetAddressesTrunkStateResponse);
rpc getAddressesBranchState(GetAddressesBranchStateRequest)
returns (GetAddressesBranchStateResponse);
rpc getAddressFundingFeeQuote(GetAddressFundingFeeQuoteRequest)
returns (GetAddressFundingFeeQuoteResponse);
rpc getRecentAddressBalanceChanges(GetRecentAddressBalanceChangesRequest)
returns (GetRecentAddressBalanceChangesResponse);
rpc getRecentCompactedAddressBalanceChanges(GetRecentCompactedAddressBalanceChangesRequest)
Expand Down Expand Up @@ -2989,6 +2991,41 @@ message GetAddressesBranchStateResponse {
oneof version { GetAddressesBranchStateResponseV0 v0 = 1; }
}

message GetAddressFundingFeeQuoteRequest {
message GetAddressFundingFeeQuoteRequestV0 {
// The funding recipient: a serialized platform address (21 bytes)
bytes address = 1;
// Optional 36-byte asset lock outpoint (txid || vout LE) of the planned
// fresh lock. Empty: the node derives a deterministic placeholder — for a
// fresh (absent) outpoint both have the same expected search depth.
bytes asset_lock_outpoint = 2;
// The user fee increase the quote should include (percent of the
// processing fee per unit); must fit in 16 bits
uint32 user_fee_increase = 3;
// Length hint for the future transition's signable bytes; 0 uses the
// node's default. Clamped server-side, so it cannot understate the fee.
uint32 signable_bytes_len_hint = 4;
}
oneof version { GetAddressFundingFeeQuoteRequestV0 v0 = 1; }
}

message GetAddressFundingFeeQuoteResponse {
message GetAddressFundingFeeQuoteResponseV0 {
// State-aware estimate of the fee the network would charge for a
// 0-input / 1-output funding executed near this state. A computed
// value, not state — there is no proof; treat it as planning data.
uint64 estimated_fee_credits = 1 [ jstype = JS_STRING ];
// The consensus admission floor for the lock (calculate_min_required_fee)
uint64 minimum_required_lock_credits = 2 [ jstype = JS_STRING ];
// The protocol version the node quoted with
uint32 protocol_version = 3;
// The committed block height the quote was computed on
uint64 state_height = 4 [ jstype = JS_STRING ];
ResponseMetadata metadata = 5;
}
oneof version { GetAddressFundingFeeQuoteResponseV0 v0 = 1; }
}

message GetRecentAddressBalanceChangesRequest {
message GetRecentAddressBalanceChangesRequestV0 {
uint64 start_height = 1 [ jstype = JS_STRING ];
Expand Down
6 changes: 6 additions & 0 deletions packages/rs-dapi/src/services/platform_service/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,12 @@ impl Platform for PlatformServiceImpl {
dapi_grpc::platform::v0::GetAddressesBranchStateResponse
);

drive_method!(
get_address_funding_fee_quote,
dapi_grpc::platform::v0::GetAddressFundingFeeQuoteRequest,
dapi_grpc::platform::v0::GetAddressFundingFeeQuoteResponse
);

drive_method!(
get_recent_address_balance_changes,
dapi_grpc::platform::v0::GetRecentAddressBalanceChangesRequest,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ mod proved;
#[cfg(all(test, feature = "state-transition-signing"))]
mod signing_tests;
mod state_transition_estimated_fee_validation;
pub use state_transition_estimated_fee_validation::calculate_address_funding_min_required_fee_for_counts;
mod state_transition_fee_strategy;
mod state_transition_like;
mod state_transition_validation;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,48 @@ use crate::state_transition::{
use crate::ProtocolError;
use platform_version::version::PlatformVersion;

/// The consensus admission floor for an address funding with the given
/// input/output counts (the output count is clamped to at least one — a
/// funding always credits at least the remainder output).
///
/// Shared by the transition's [`StateTransitionEstimatedFeeValidation`] impl
/// and by the fee-quote query path, so a floor reported without a built
/// transition can never drift from the one the transition enforces.
pub fn calculate_address_funding_min_required_fee_for_counts(
input_count: usize,
output_count: usize,
platform_version: &PlatformVersion,
) -> Result<Credits, ProtocolError> {
let min_fees = &platform_version.fee_version.state_transition_min_fees;
let asset_lock_base_cost = platform_version
.dpp
.state_transitions
.identities
.asset_locks
.required_asset_lock_duff_balance_for_processing_start_for_address_funding
* CREDITS_PER_DUFF;
let output_count = output_count.max(1);
Ok(asset_lock_base_cost.saturating_add(
min_fees
.address_funds_transfer_input_cost
.saturating_mul(input_count as u64)
.saturating_add(
min_fees
.address_funds_transfer_output_cost
.saturating_mul(output_count as u64),
),
))
}

impl StateTransitionEstimatedFeeValidation for AddressFundingFromAssetLockTransition {
fn calculate_min_required_fee(
&self,
platform_version: &PlatformVersion,
) -> Result<Credits, ProtocolError> {
let min_fees = &platform_version.fee_version.state_transition_min_fees;
let asset_lock_base_cost = platform_version
.dpp
.state_transitions
.identities
.asset_locks
.required_asset_lock_duff_balance_for_processing_start_for_address_funding
* CREDITS_PER_DUFF;
let input_count = self.inputs().len();
let output_count = self.outputs().len().max(1);
Ok(asset_lock_base_cost.saturating_add(
min_fees
.address_funds_transfer_input_cost
.saturating_mul(input_count as u64)
.saturating_add(
min_fees
.address_funds_transfer_output_cost
.saturating_mul(output_count as u64),
),
))
calculate_address_funding_min_required_fee_for_counts(
self.inputs().len(),
self.outputs().len(),
platform_version,
)
}
}
2 changes: 1 addition & 1 deletion packages/rs-drive-abci/src/execution/types/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ pub mod block_state_info;
/// An execution event
pub(in crate::execution) mod execution_event;
/// A structure representing the context of the execution of a state transition
pub(in crate::execution) mod execution_operation;
pub(crate) mod execution_operation;
/// A structure showing the storage and processing fees in a pool
pub(in crate::execution) mod fees_in_pools;
/// The outcome of processing block fees
Expand Down
Loading
Loading