Skip to content
2 changes: 2 additions & 0 deletions packages/rs-sdk/src/platform/tokens/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ pub mod token_info;
pub mod token_status;
/// Token total supply query
pub mod token_total_supply;
/// Token state transitions
pub mod transitions;
62 changes: 62 additions & 0 deletions packages/rs-sdk/src/platform/tokens/transitions/burn.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
use crate::platform::transition::broadcast::BroadcastStateTransition;
use crate::platform::transition::fungible_tokens::burn::TokenBurnTransitionBuilder;
use crate::{Error, Sdk};
use dpp::balances::credits::TokenAmount;
use dpp::data_contract::group::GroupSumPower;
use dpp::document::Document;
use dpp::group::group_action_status::GroupActionStatus;
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
use dpp::platform_value::Identifier;
use dpp::state_transition::proof_result::StateTransitionProofResult;

pub enum BurnResult {
TokenBalance(Identifier, TokenAmount),
HistoricalDocument(Document),
GroupActionWithDocument(GroupSumPower, Option<Document>),
GroupActionWithBalance(GroupSumPower, GroupActionStatus, Option<TokenAmount>),
}

impl Sdk {
pub async fn token_burn<'a, S: Signer>(

Check failure on line 21 in packages/rs-sdk/src/platform/tokens/transitions/burn.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

the following explicit lifetimes could be elided: 'a

error: the following explicit lifetimes could be elided: 'a --> packages/rs-sdk/src/platform/tokens/transitions/burn.rs:21:29 | 21 | pub async fn token_burn<'a, S: Signer>( | ^^ 22 | &self, 23 | burn_tokens_transition_builder: TokenBurnTransitionBuilder<'a>, | ^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes = note: `-D clippy::needless-lifetimes` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::needless_lifetimes)]`
&self,
burn_tokens_transition_builder: TokenBurnTransitionBuilder<'a>,
signing_key: &IdentityPublicKey,
signer: &S,
) -> Result<BurnResult, Error> {
let platform_version = self.version();

let state_transition = burn_tokens_transition_builder
.sign(self, signing_key, signer, &platform_version, None)

Check failure on line 30 in packages/rs-sdk/src/platform/tokens/transitions/burn.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

this expression creates a reference which is immediately dereferenced by the compiler

error: this expression creates a reference which is immediately dereferenced by the compiler --> packages/rs-sdk/src/platform/tokens/transitions/burn.rs:30:46 | 30 | .sign(self, signing_key, signer, &platform_version, None) | ^^^^^^^^^^^^^^^^^ help: change this to: `platform_version` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow = note: `-D clippy::needless-borrow` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::needless_borrow)]`
.await?;

let proof_result = state_transition
.broadcast_and_wait::<StateTransitionProofResult>(self, None)
.await?;

match proof_result {
StateTransitionProofResult::VerifiedTokenBalance(owner_id, remaining_balance) => {
Ok(BurnResult::TokenBalance(owner_id, remaining_balance))
}
StateTransitionProofResult::VerifiedTokenActionWithDocument(doc) => {
// This means the token keeps burning history
Ok(BurnResult::HistoricalDocument(doc))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(power, doc) => {
// This means it's a group action with history
Ok(BurnResult::GroupActionWithDocument(power, doc))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithTokenBalance(power, status, balance) => {
// Group action without history
Ok(BurnResult::GroupActionWithBalance(power, status, balance))
}
_ => Err(Error::DriveProofError(
drive::error::proof::ProofError::UnexpectedResultProof(
"Expected VerifiedTokenBalance, VerifiedTokenActionWithDocument, VerifiedTokenGroupActionWithDocument, or VerifiedTokenGroupActionWithTokenBalance for burn transition".to_string(),
),
vec![],
Default::default(),
)),
}
}
}
57 changes: 57 additions & 0 deletions packages/rs-sdk/src/platform/tokens/transitions/claim.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
use crate::platform::transition::broadcast::BroadcastStateTransition;
use crate::platform::transition::fungible_tokens::claim::TokenClaimTransitionBuilder;
use crate::{Error, Sdk};
use dpp::data_contract::group::GroupSumPower;
use dpp::document::Document;
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
use dpp::state_transition::proof_result::StateTransitionProofResult;

pub enum ClaimResult {
Document(Document),
GroupActionWithDocument(GroupSumPower, Document),
}

impl Sdk {
pub async fn token_claim<'a, S: Signer>(

Check failure on line 16 in packages/rs-sdk/src/platform/tokens/transitions/claim.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

the following explicit lifetimes could be elided: 'a

error: the following explicit lifetimes could be elided: 'a --> packages/rs-sdk/src/platform/tokens/transitions/claim.rs:16:30 | 16 | pub async fn token_claim<'a, S: Signer>( | ^^ 17 | &self, 18 | claim_tokens_transition_builder: TokenClaimTransitionBuilder<'a>, | ^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
&self,
claim_tokens_transition_builder: TokenClaimTransitionBuilder<'a>,
signing_key: &IdentityPublicKey,
signer: &S,
) -> Result<ClaimResult, Error> {
let platform_version = self.version();

let state_transition = claim_tokens_transition_builder
.sign(self, signing_key, signer, &platform_version, None)

Check failure on line 25 in packages/rs-sdk/src/platform/tokens/transitions/claim.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

this expression creates a reference which is immediately dereferenced by the compiler

error: this expression creates a reference which is immediately dereferenced by the compiler --> packages/rs-sdk/src/platform/tokens/transitions/claim.rs:25:46 | 25 | .sign(self, signing_key, signer, &platform_version, None) | ^^^^^^^^^^^^^^^^^ help: change this to: `platform_version` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
.await?;

let proof_result = state_transition
.broadcast_and_wait::<StateTransitionProofResult>(self, None)
.await?;

match proof_result {
StateTransitionProofResult::VerifiedTokenActionWithDocument(document) => {
Ok(ClaimResult::Document(document))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(power, Some(document)) => {
Ok(ClaimResult::GroupActionWithDocument(power, document))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(_, None) => {
Err(Error::DriveProofError(
drive::error::proof::ProofError::IncorrectProof(
"Expected document in group action result".to_string(),
),
vec![],
Default::default(),
))
}
_ => Err(Error::DriveProofError(
drive::error::proof::ProofError::UnexpectedResultProof(
"Expected VerifiedTokenActionWithDocument or VerifiedTokenGroupActionWithDocument for claim transition".to_string(),
),
vec![],
Default::default(),
)),
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
use crate::platform::transition::broadcast::BroadcastStateTransition;
use crate::platform::transition::fungible_tokens::config_update::TokenConfigUpdateTransitionBuilder;
use crate::{Error, Sdk};
use dpp::data_contract::group::GroupSumPower;
use dpp::document::Document;
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
use dpp::state_transition::proof_result::StateTransitionProofResult;

pub enum ConfigUpdateResult {
Document(Document),
GroupActionWithDocument(GroupSumPower, Document),
}

impl Sdk {
pub async fn token_update_contract_token_configuration<'a, S: Signer>(

Check failure on line 16 in packages/rs-sdk/src/platform/tokens/transitions/config_update.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

the following explicit lifetimes could be elided: 'a

error: the following explicit lifetimes could be elided: 'a --> packages/rs-sdk/src/platform/tokens/transitions/config_update.rs:16:60 | 16 | pub async fn token_update_contract_token_configuration<'a, S: Signer>( | ^^ 17 | &self, 18 | config_update_transition_builder: TokenConfigUpdateTransitionBuilder<'a>, | ^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
&self,
config_update_transition_builder: TokenConfigUpdateTransitionBuilder<'a>,
signing_key: &IdentityPublicKey,
signer: &S,
) -> Result<ConfigUpdateResult, Error> {
let platform_version = self.version();

let state_transition = config_update_transition_builder
.sign(self, signing_key, signer, &platform_version, None)

Check failure on line 25 in packages/rs-sdk/src/platform/tokens/transitions/config_update.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

this expression creates a reference which is immediately dereferenced by the compiler

error: this expression creates a reference which is immediately dereferenced by the compiler --> packages/rs-sdk/src/platform/tokens/transitions/config_update.rs:25:46 | 25 | .sign(self, signing_key, signer, &platform_version, None) | ^^^^^^^^^^^^^^^^^ help: change this to: `platform_version` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
.await?;

let proof_result = state_transition
.broadcast_and_wait::<StateTransitionProofResult>(self, None)
.await?;

match proof_result {
StateTransitionProofResult::VerifiedTokenActionWithDocument(document) => {
Ok(ConfigUpdateResult::Document(document))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(power, Some(document)) => {
Ok(ConfigUpdateResult::GroupActionWithDocument(power, document))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(_, None) => {
Err(Error::DriveProofError(
drive::error::proof::ProofError::IncorrectProof(
"Expected document in group action result".to_string(),
),
vec![],
Default::default(),
))
}
_ => Err(Error::DriveProofError(
drive::error::proof::ProofError::UnexpectedResultProof(
"Expected VerifiedTokenActionWithDocument or VerifiedTokenGroupActionWithDocument for config update transition"
.to_string(),
),
vec![],
Default::default(),
)),
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
use crate::platform::transition::broadcast::BroadcastStateTransition;
use crate::platform::transition::fungible_tokens::destroy::TokenDestroyFrozenFundsTransitionBuilder;
use crate::{Error, Sdk};
use dpp::data_contract::group::GroupSumPower;
use dpp::document::Document;
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
use dpp::state_transition::proof_result::StateTransitionProofResult;

pub enum DestroyFrozenFundsResult {
HistoricalDocument(Document),
GroupActionWithDocument(GroupSumPower, Option<Document>),
}

impl Sdk {
pub async fn token_destroy_frozen_funds<'a, S: Signer>(

Check failure on line 16 in packages/rs-sdk/src/platform/tokens/transitions/destroy_frozen_funds.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

the following explicit lifetimes could be elided: 'a

error: the following explicit lifetimes could be elided: 'a --> packages/rs-sdk/src/platform/tokens/transitions/destroy_frozen_funds.rs:16:45 | 16 | pub async fn token_destroy_frozen_funds<'a, S: Signer>( | ^^ 17 | &self, 18 | destroy_frozen_funds_transition_builder: TokenDestroyFrozenFundsTransitionBuilder<'a>, | ^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
&self,
destroy_frozen_funds_transition_builder: TokenDestroyFrozenFundsTransitionBuilder<'a>,
signing_key: &IdentityPublicKey,
signer: &S,
) -> Result<DestroyFrozenFundsResult, Error> {
let platform_version = self.version();

let state_transition = destroy_frozen_funds_transition_builder
.sign(self, signing_key, signer, &platform_version, None)

Check failure on line 25 in packages/rs-sdk/src/platform/tokens/transitions/destroy_frozen_funds.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

this expression creates a reference which is immediately dereferenced by the compiler

error: this expression creates a reference which is immediately dereferenced by the compiler --> packages/rs-sdk/src/platform/tokens/transitions/destroy_frozen_funds.rs:25:46 | 25 | .sign(self, signing_key, signer, &platform_version, None) | ^^^^^^^^^^^^^^^^^ help: change this to: `platform_version` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
.await?;

let proof_result = state_transition
.broadcast_and_wait::<StateTransitionProofResult>(self, None)
.await?;

match proof_result {
StateTransitionProofResult::VerifiedTokenActionWithDocument(doc) => {
// DestroyFrozenFunds always keeps history
Ok(DestroyFrozenFundsResult::HistoricalDocument(doc))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(power, doc) => {
// Group action with history
Ok(DestroyFrozenFundsResult::GroupActionWithDocument(power, doc))
}
_ => Err(Error::DriveProofError(
drive::error::proof::ProofError::UnexpectedResultProof(
"Expected VerifiedTokenActionWithDocument or VerifiedTokenGroupActionWithDocument for destroy frozen funds transition".to_string(),
),
vec![],
Default::default(),
)),
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
use crate::platform::transition::broadcast::BroadcastStateTransition;
use crate::platform::transition::fungible_tokens::purchase::TokenDirectPurchaseTransitionBuilder;
use crate::{Error, Sdk};
use dpp::balances::credits::TokenAmount;
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
use dpp::platform_value::Identifier;
use dpp::state_transition::proof_result::StateTransitionProofResult;

impl Sdk {
pub async fn token_purchase<'a, S: Signer>(

Check failure on line 11 in packages/rs-sdk/src/platform/tokens/transitions/direct_purchase.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

the following explicit lifetimes could be elided: 'a

error: the following explicit lifetimes could be elided: 'a --> packages/rs-sdk/src/platform/tokens/transitions/direct_purchase.rs:11:33 | 11 | pub async fn token_purchase<'a, S: Signer>( | ^^ 12 | &self, 13 | purchase_tokens_transition_builder: TokenDirectPurchaseTransitionBuilder<'a>, | ^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
&self,
purchase_tokens_transition_builder: TokenDirectPurchaseTransitionBuilder<'a>,
signing_key: &IdentityPublicKey,
signer: &S,
) -> Result<DirectPurchaseResult, Error> {
let platform_version = self.version();

let state_transition = purchase_tokens_transition_builder
.sign(self, signing_key, signer, &platform_version, None)

Check failure on line 20 in packages/rs-sdk/src/platform/tokens/transitions/direct_purchase.rs

View workflow job for this annotation

GitHub Actions / Rust packages (dash-sdk) / Linting

this expression creates a reference which is immediately dereferenced by the compiler

error: this expression creates a reference which is immediately dereferenced by the compiler --> packages/rs-sdk/src/platform/tokens/transitions/direct_purchase.rs:20:46 | 20 | .sign(self, signing_key, signer, &platform_version, None) | ^^^^^^^^^^^^^^^^^ help: change this to: `platform_version` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
.await?;

let proof_result = state_transition
.broadcast_and_wait::<StateTransitionProofResult>(self, None)
.await?;

match proof_result {
StateTransitionProofResult::VerifiedTokenBalance(owner_id, balance) => {
Ok(DirectPurchaseResult::TokenBalance(owner_id, balance))
}
StateTransitionProofResult::VerifiedTokenActionWithDocument(doc) => {
Ok(DirectPurchaseResult::HistoricalDocument(doc))
}
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(power, doc) => {
Ok(DirectPurchaseResult::GroupActionWithDocument(power, doc))
}
_ => Err(Error::DriveProofError(
drive::error::proof::ProofError::UnexpectedResultProof(
"Expected VerifiedTokenBalance, VerifiedTokenActionWithDocument, or VerifiedTokenGroupActionWithDocument for direct purchase transition".to_string(),
),
vec![],
Default::default(),
)),
}
}
}

pub enum DirectPurchaseResult {
TokenBalance(Identifier, TokenAmount),
HistoricalDocument(dpp::document::Document),
GroupActionWithDocument(
dpp::data_contract::group::GroupSumPower,
Option<dpp::document::Document>,
),
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
use crate::platform::transition::broadcast::BroadcastStateTransition;
use crate::platform::transition::fungible_tokens::emergency_action::TokenEmergencyActionTransitionBuilder;
use crate::{Error, Sdk};
use dpp::data_contract::group::GroupSumPower;
use dpp::document::Document;
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
use dpp::state_transition::proof_result::StateTransitionProofResult;

impl Sdk {
pub async fn token_emergency_action<'a, S: Signer>(
&self,
emergency_action_transition_builder: TokenEmergencyActionTransitionBuilder<'a>,
signing_key: &IdentityPublicKey,
signer: &S,
) -> Result<EmergencyActionResult, Error> {
let platform_version = self.version();

let state_transition = emergency_action_transition_builder
.sign(self, signing_key, signer, &platform_version, None)
.await?;

let proof_result = state_transition
.broadcast_and_wait::<StateTransitionProofResult>(self, None)
.await?;

match proof_result {
StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(
group_power,
document,
) => Ok(EmergencyActionResult::GroupActionWithDocument(
group_power,
document,
)),
_ => Err(Error::DriveProofError(
drive::error::proof::ProofError::UnexpectedResultProof(
"Expected VerifiedTokenGroupActionWithDocument for emergency action transition"
.to_string(),
),
vec![],
Default::default(),
)),
}
}
}

pub enum EmergencyActionResult {
GroupActionWithDocument(GroupSumPower, Option<Document>),
}
Loading
Loading