Skip to content

feat(sdk): improve token state transition functionalities in rs-sdk #2657

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Jun 4, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ impl TokenConfigurationV0Getters for TokenConfigurationV0 {
),
(
"trade_mode_change_rules",
&self.marketplace_rules.trade_mode_change_rules(),
self.marketplace_rules.trade_mode_change_rules(),
),
("manual_minting_rules", &self.manual_minting_rules),
("manual_burning_rules", &self.manual_burning_rules),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,32 @@ use dpp::state_transition::batch_transition::BatchTransition;
use dpp::state_transition::StateTransition;
use dpp::tokens::calculate_token_id;
use dpp::version::PlatformVersion;
use std::sync::Arc;

/// A builder to configure and broadcast token burn transitions
pub struct TokenBurnTransitionBuilder<'a> {
data_contract: &'a DataContract,
token_position: TokenContractPosition,
owner_id: Identifier,
amount: TokenAmount,
public_note: Option<String>,
settings: Option<PutSettings>,
user_fee_increase: Option<UserFeeIncrease>,
using_group_info: Option<GroupStateTransitionInfoStatus>,
pub struct TokenBurnTransitionBuilder {
pub data_contract: Arc<DataContract>,
pub token_position: TokenContractPosition,
pub owner_id: Identifier,
pub amount: TokenAmount,
pub public_note: Option<String>,
pub settings: Option<PutSettings>,
pub user_fee_increase: Option<UserFeeIncrease>,
pub using_group_info: Option<GroupStateTransitionInfoStatus>,
pub state_transition_creation_options: Option<StateTransitionCreationOptions>,
}

impl<'a> TokenBurnTransitionBuilder<'a> {
impl TokenBurnTransitionBuilder {
/// Creates a new `TokenBurnTransitionBuilder`
///
/// # Arguments
///
/// * `data_contract` - A reference to the data contract
/// * `data_contract` - An Arc to the data contract
/// * `token_position` - The position of the token in the contract
/// * `owner_id` - The identifier of the token owner
/// * `amount` - The amount of tokens to burn
pub fn new(
data_contract: &'a DataContract,
data_contract: Arc<DataContract>,
token_position: TokenContractPosition,
owner_id: Identifier,
amount: TokenAmount,
Expand All @@ -51,6 +53,7 @@ impl<'a> TokenBurnTransitionBuilder<'a> {
settings: None,
user_fee_increase: None,
using_group_info: None,
state_transition_creation_options: None,
}
}

Expand Down Expand Up @@ -110,6 +113,23 @@ impl<'a> TokenBurnTransitionBuilder<'a> {
self
}

/// Adds state transition creation options to the token burn transition
///
/// # Arguments
///
/// * `state_transition_creation_options` - The signing options to add
///
/// # Returns
///
/// * `Self` - The updated builder
pub fn with_state_transition_creation_options(
mut self,
state_transition_creation_options: StateTransitionCreationOptions,
) -> Self {
self.state_transition_creation_options = Some(state_transition_creation_options);
self
}

/// Signs the token burn transition
///
/// # Arguments
Expand All @@ -123,12 +143,11 @@ impl<'a> TokenBurnTransitionBuilder<'a> {
///
/// * `Result<StateTransition, Error>` - The signed state transition or an error
pub async fn sign(
&self,
self,
sdk: &Sdk,
identity_public_key: &IdentityPublicKey,
signer: &impl Signer,
platform_version: &PlatformVersion,
options: Option<StateTransitionCreationOptions>,
) -> Result<StateTransition, Error> {
let token_id = Identifier::from(calculate_token_id(
self.data_contract.id().as_bytes(),
Expand Down Expand Up @@ -157,7 +176,7 @@ impl<'a> TokenBurnTransitionBuilder<'a> {
self.user_fee_increase.unwrap_or_default(),
signer,
platform_version,
options,
self.state_transition_creation_options,
)?;

Ok(state_transition)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,26 @@ use dpp::state_transition::batch_transition::BatchTransition;
use dpp::state_transition::StateTransition;
use dpp::tokens::calculate_token_id;
use dpp::version::PlatformVersion;
use std::sync::Arc;

/// A builder to configure and broadcast token claim transitions
pub struct TokenClaimTransitionBuilder<'a> {
data_contract: &'a DataContract,
token_position: TokenContractPosition,
owner_id: Identifier,
distribution_type: TokenDistributionType,
public_note: Option<String>,
settings: Option<PutSettings>,
user_fee_increase: Option<UserFeeIncrease>,
pub struct TokenClaimTransitionBuilder {
pub data_contract: Arc<DataContract>,
pub token_position: TokenContractPosition,
pub owner_id: Identifier,
pub distribution_type: TokenDistributionType,
pub public_note: Option<String>,
pub settings: Option<PutSettings>,
pub user_fee_increase: Option<UserFeeIncrease>,
pub state_transition_creation_options: Option<StateTransitionCreationOptions>,
}

impl<'a> TokenClaimTransitionBuilder<'a> {
impl TokenClaimTransitionBuilder {
/// Start building a claim tokens transition for the provided DataContract.
///
/// # Arguments
///
/// * `data_contract` - A reference to the data contract
/// * `data_contract` - An Arc to the data contract
/// * `token_position` - The position of the token in the contract
/// * `owner_id` - The identifier of the state transition owner
/// * `distribution_type` - The token distribution type
Expand All @@ -39,13 +41,11 @@ impl<'a> TokenClaimTransitionBuilder<'a> {
///
/// * `Self` - The new builder instance
pub fn new(
data_contract: &'a DataContract,
data_contract: Arc<DataContract>,
token_position: TokenContractPosition,
owner_id: Identifier,
distribution_type: TokenDistributionType,
) -> Self {
// TODO: Validate token position

Self {
data_contract,
token_position,
Expand All @@ -54,6 +54,7 @@ impl<'a> TokenClaimTransitionBuilder<'a> {
public_note: None,
settings: None,
user_fee_increase: None,
state_transition_creation_options: None,
}
}

Expand Down Expand Up @@ -99,6 +100,23 @@ impl<'a> TokenClaimTransitionBuilder<'a> {
self
}

/// Adds state transition creation options to the token claim transition
///
/// # Arguments
///
/// * `state_transition_creation_options` - The state transition creation options to add
///
/// # Returns
///
/// * `Self` - The updated builder
pub fn with_state_transition_creation_options(
mut self,
state_transition_creation_options: StateTransitionCreationOptions,
) -> Self {
self.state_transition_creation_options = Some(state_transition_creation_options);
self
}

/// Signs the token claim transition
///
/// # Arguments
Expand All @@ -112,12 +130,11 @@ impl<'a> TokenClaimTransitionBuilder<'a> {
///
/// * `Result<StateTransition, Error>` - The signed state transition or an error
pub async fn sign(
&self,
self,
sdk: &Sdk,
identity_public_key: &IdentityPublicKey,
signer: &impl Signer,
platform_version: &PlatformVersion,
options: Option<StateTransitionCreationOptions>,
) -> Result<StateTransition, Error> {
let token_id = Identifier::from(calculate_token_id(
self.data_contract.id().as_bytes(),
Expand Down Expand Up @@ -145,7 +162,7 @@ impl<'a> TokenClaimTransitionBuilder<'a> {
self.user_fee_increase.unwrap_or_default(),
signer,
platform_version,
options,
self.state_transition_creation_options,
)?;

Ok(state_transition)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,27 @@ use dpp::state_transition::batch_transition::BatchTransition;
use dpp::state_transition::StateTransition;
use dpp::tokens::calculate_token_id;
use dpp::version::PlatformVersion;
use std::sync::Arc;

/// A builder to configure and broadcast token config_update transitions
pub struct TokenConfigUpdateTransitionBuilder<'a> {
data_contract: &'a DataContract,
token_position: TokenContractPosition,
owner_id: Identifier,
update_token_configuration_item: TokenConfigurationChangeItem,
public_note: Option<String>,
using_group_info: Option<GroupStateTransitionInfoStatus>,
settings: Option<PutSettings>,
user_fee_increase: Option<UserFeeIncrease>,
pub struct TokenConfigUpdateTransitionBuilder {
pub data_contract: Arc<DataContract>,
pub token_position: TokenContractPosition,
pub owner_id: Identifier,
pub update_token_configuration_item: TokenConfigurationChangeItem,
pub public_note: Option<String>,
pub using_group_info: Option<GroupStateTransitionInfoStatus>,
pub settings: Option<PutSettings>,
pub user_fee_increase: Option<UserFeeIncrease>,
pub state_transition_creation_options: Option<StateTransitionCreationOptions>,
}

impl<'a> TokenConfigUpdateTransitionBuilder<'a> {
impl TokenConfigUpdateTransitionBuilder {
/// Start building a config_update tokens transition for the provided DataContract.
///
/// # Arguments
///
/// * `data_contract` - A reference to the data contract
/// * `data_contract` - An Arc to the data contract
/// * `token_position` - The position of the token in the contract
/// * `owner_id` - The identifier of the state transition owner
/// * `update_token_configuration_item` - The token configuration change item
Expand All @@ -42,13 +44,11 @@ impl<'a> TokenConfigUpdateTransitionBuilder<'a> {
///
/// * `Self` - The new builder instance
pub fn new(
data_contract: &'a DataContract,
data_contract: Arc<DataContract>,
token_position: TokenContractPosition,
owner_id: Identifier,
update_token_configuration_item: TokenConfigurationChangeItem,
) -> Self {
// TODO: Validate token position

Self {
data_contract,
token_position,
Expand All @@ -58,6 +58,7 @@ impl<'a> TokenConfigUpdateTransitionBuilder<'a> {
using_group_info: None,
settings: None,
user_fee_increase: None,
state_transition_creation_options: None,
}
}

Expand Down Expand Up @@ -120,6 +121,23 @@ impl<'a> TokenConfigUpdateTransitionBuilder<'a> {
self
}

/// Adds state transition creation options to the token config_update transition
///
/// # Arguments
///
/// * `state_transition_creation_options` - The state transition creation options to add
///
/// # Returns
///
/// * `Self` - The updated builder
pub fn with_state_transition_creation_options(
mut self,
state_transition_creation_options: StateTransitionCreationOptions,
) -> Self {
self.state_transition_creation_options = Some(state_transition_creation_options);
self
}

/// Signs the token config_update transition
///
/// # Arguments
Expand All @@ -133,12 +151,11 @@ impl<'a> TokenConfigUpdateTransitionBuilder<'a> {
///
/// * `Result<StateTransition, Error>` - The signed state transition or an error
pub async fn sign(
&self,
self,
sdk: &Sdk,
identity_public_key: &IdentityPublicKey,
signer: &impl Signer,
platform_version: &PlatformVersion,
options: Option<StateTransitionCreationOptions>,
) -> Result<StateTransition, Error> {
let token_id = Identifier::from(calculate_token_id(
self.data_contract.id().as_bytes(),
Expand Down Expand Up @@ -167,7 +184,7 @@ impl<'a> TokenConfigUpdateTransitionBuilder<'a> {
self.user_fee_increase.unwrap_or_default(),
signer,
platform_version,
options,
self.state_transition_creation_options,
)?;

Ok(state_transition)
Expand Down
Loading
Loading