Skip to content

Commit

Permalink
feat(sdk): enable withdrawals v1 in JS SDK (#2201)
Browse files Browse the repository at this point in the history
  • Loading branch information
shumkov authored Oct 4, 2024
1 parent 37b5ea4 commit 8773afa
Show file tree
Hide file tree
Showing 18 changed files with 138 additions and 53 deletions.
Binary file added .yarn/cache/fsevents-patch-19706e7e35-10.zip
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -28,37 +28,50 @@ const MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE = 1;
const MINIMAL_WITHDRAWAL_AMOUNT = ASSET_UNLOCK_TX_SIZE * MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE * 1000;

type WithdrawalOptions = {
signingKeyIndex: number
signingKeyIndex?: number
toAddress?: string
};

/** Creates platform credits withdrawal request
* @param identity - identity to withdraw from
* @param amount - amount of credits to withdraw
* @param to - Dash L1 address
* @param options - withdrawal options
* @param [options] - withdrawal options
* @param [options.toAddress] - withdrawal destination address
*/
export async function creditWithdrawal(
this: Platform,
identity: Identity,
amount: number,
to: string,
options: WithdrawalOptions = {
signingKeyIndex: 3,
},
options: WithdrawalOptions = { },
): Promise<Metadata> {
await this.initialize();

// eslint-disable-next-line no-param-reassign
options = {
...options,
signingKeyIndex: 3,
};

const { dpp } = this;

let toAddress: Address;
try {
toAddress = new Address(to, this.client.network);
} catch (e) {
throw new Error(`Invalid core recipient "${to}" for network ${this.client.network}`);
let outputScriptBytes: Buffer | undefined;
if (options.toAddress) {
let toAddress: Address;
try {
toAddress = new Address(options.toAddress, this.client.network);
} catch (e) {
throw new Error(`Invalid core recipient "${options.toAddress}" for network ${this.client.network}`);
}

const outputScript = Script.buildPublicKeyHashOut(toAddress);
// @ts-ignore
outputScriptBytes = outputScript.toBuffer();

this.logger.debug(`[Identity#creditWithdrawal] credits withdrawal from ${identity.getId().toString()} to ${toAddress.toString()} with amount ${amount}`);
} else {
this.logger.debug(`[Identity#creditWithdrawal] credits withdrawal from ${identity.getId().toString()} to recent withdrawal address with amount ${amount}`);
}
this.logger.debug(`[Identity#creditWithdrawal] credits withdrawal from ${identity.getId().toString()} to ${toAddress.toString()} with amount ${amount}`);

const outputScript = Script.buildPublicKeyHashOut(toAddress);

const balance = identity.getBalance();
if (amount > balance) {
Expand Down Expand Up @@ -88,8 +101,7 @@ export async function creditWithdrawal(
BigInt(amount),
coreFeePerByte,
DEFAULT_POOLING,
// @ts-ignore
outputScript.toBuffer(),
outputScriptBytes,
BigInt(identityNonce),
);

Expand Down
2 changes: 1 addition & 1 deletion packages/rs-dpp/src/identity/identity_facade.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ impl IdentityFacade {
amount: u64,
core_fee_per_byte: u32,
pooling: Pooling,
output_script: CoreScript,
output_script: Option<CoreScript>,
identity_nonce: u64,
) -> Result<IdentityCreditWithdrawalTransition, ProtocolError> {
self.factory.create_identity_credit_withdrawal_transition(
Expand Down
65 changes: 53 additions & 12 deletions packages/rs-dpp/src/identity/identity_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ use crate::state_transition::identity_credit_transfer_transition::IdentityCredit
#[cfg(all(feature = "state-transitions", feature = "client"))]
use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0;
#[cfg(all(feature = "state-transitions", feature = "client"))]
use crate::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1;
#[cfg(all(feature = "state-transitions", feature = "client"))]
use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition;
#[cfg(all(feature = "state-transitions", feature = "client"))]
use crate::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0;
Expand Down Expand Up @@ -233,22 +235,61 @@ impl IdentityFactory {
amount: u64,
core_fee_per_byte: u32,
pooling: Pooling,
output_script: CoreScript,
output_script: Option<CoreScript>,
identity_nonce: IdentityNonce,
) -> Result<IdentityCreditWithdrawalTransition, ProtocolError> {
let identity_credit_withdrawal_transition = IdentityCreditWithdrawalTransitionV0 {
identity_id,
amount,
core_fee_per_byte,
pooling,
output_script,
nonce: identity_nonce,
..Default::default()
let platform_version = PlatformVersion::get(self.protocol_version)?;

let identity_credit_withdrawal_transition = match platform_version
.dpp
.state_transitions
.identities
.credit_withdrawal
.default_constructor
{
0 => {
let output_script = output_script.ok_or_else(|| {
ProtocolError::Generic(
"Output script is required for IdentityCreditWithdrawalTransitionV0"
.to_string(),
)
})?;

let transition = IdentityCreditWithdrawalTransitionV0 {
identity_id,
amount,
core_fee_per_byte,
pooling,
output_script,
nonce: identity_nonce,
..Default::default()
};

IdentityCreditWithdrawalTransition::from(transition)
}
1 => {
let transition = IdentityCreditWithdrawalTransitionV1 {
identity_id,
amount,
core_fee_per_byte,
pooling,
output_script,
nonce: identity_nonce,
..Default::default()
};

IdentityCreditWithdrawalTransition::from(transition)
}
version => {
return Err(ProtocolError::UnknownVersionMismatch {
method: "create_identity_credit_withdrawal_transition".to_string(),
known_versions: vec![0, 1],
received: version,
});
}
};

Ok(IdentityCreditWithdrawalTransition::from(
identity_credit_withdrawal_transition,
))
Ok(identity_credit_withdrawal_transition)
}

#[cfg(all(feature = "state-transitions", feature = "client"))]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,10 @@ impl IdentityCreditWithdrawalTransition {
pub fn default_versioned(platform_version: &PlatformVersion) -> Result<Self, ProtocolError> {
match platform_version
.dpp
.identity_versions
.identity_structure_version
.state_transitions
.identities
.credit_withdrawal
.default_constructor
{
0 => Ok(IdentityCreditWithdrawalTransition::V0(
IdentityCreditWithdrawalTransitionV0::default(),
Expand Down
6 changes: 6 additions & 0 deletions packages/rs-platform-version/src/version/dpp_versions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ pub struct StateTransitionVersions {
pub struct IdentityTransitionVersions {
pub max_public_keys_in_creation: u16,
pub asset_locks: IdentityTransitionAssetLockVersions,
pub credit_withdrawal: IdentityCreditWithdrawalTransitionVersions,
}

#[derive(Clone, Debug, Default)]
pub struct IdentityCreditWithdrawalTransitionVersions {
pub default_constructor: FeatureVersion,
}

#[derive(Clone, Debug, Default)]
Expand Down
8 changes: 6 additions & 2 deletions packages/rs-platform-version/src/version/mocks/v2_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{
DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions,
DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions,
DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions,
IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions,
IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions,
IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions,
JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
RecursiveSchemaValidatorVersions, StateTransitionConversionVersions,
StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions,
VotingValidationVersions, VotingVersions,
Expand Down Expand Up @@ -1183,6 +1184,9 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion {
validate_asset_lock_transaction_structure: 0,
validate_instant_asset_lock_proof_structure: 0,
},
credit_withdrawal: IdentityCreditWithdrawalTransitionVersions {
default_constructor: 0,
},
},
},
contract_versions: ContractVersions {
Expand Down
8 changes: 6 additions & 2 deletions packages/rs-platform-version/src/version/mocks/v3_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{
DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions,
DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions,
DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions,
IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions,
IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions,
IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions,
JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
RecursiveSchemaValidatorVersions, StateTransitionConversionVersions,
StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions,
VotingValidationVersions, VotingVersions,
Expand Down Expand Up @@ -1183,6 +1184,9 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion {
validate_asset_lock_transaction_structure: 0,
validate_instant_asset_lock_proof_structure: 0,
},
credit_withdrawal: IdentityCreditWithdrawalTransitionVersions {
default_constructor: 0,
},
},
},
contract_versions: ContractVersions {
Expand Down
8 changes: 6 additions & 2 deletions packages/rs-platform-version/src/version/v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{
DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions,
DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions,
DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions,
IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions,
IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions,
IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions,
JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
RecursiveSchemaValidatorVersions, StateTransitionConversionVersions,
StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions,
VotingValidationVersions, VotingVersions,
Expand Down Expand Up @@ -1182,6 +1183,9 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion {
validate_asset_lock_transaction_structure: 0,
validate_instant_asset_lock_proof_structure: 0,
},
credit_withdrawal: IdentityCreditWithdrawalTransitionVersions {
default_constructor: 0,
},
},
},
contract_versions: ContractVersions {
Expand Down
8 changes: 6 additions & 2 deletions packages/rs-platform-version/src/version/v2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{
DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions,
DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions,
DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions,
IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions,
IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions,
IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions,
JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
RecursiveSchemaValidatorVersions, StateTransitionConversionVersions,
StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions,
VotingValidationVersions, VotingVersions,
Expand Down Expand Up @@ -1182,6 +1183,9 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion {
validate_asset_lock_transaction_structure: 0,
validate_instant_asset_lock_proof_structure: 0,
},
credit_withdrawal: IdentityCreditWithdrawalTransitionVersions {
default_constructor: 0,
},
},
},
contract_versions: ContractVersions {
Expand Down
8 changes: 6 additions & 2 deletions packages/rs-platform-version/src/version/v3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{
DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions,
DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions,
DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions,
IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions,
IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions,
IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions,
JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
RecursiveSchemaValidatorVersions, StateTransitionConversionVersions,
StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions,
VotingValidationVersions, VotingVersions,
Expand Down Expand Up @@ -1189,6 +1190,9 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion {
validate_asset_lock_transaction_structure: 0,
validate_instant_asset_lock_proof_structure: 0,
},
credit_withdrawal: IdentityCreditWithdrawalTransitionVersions {
default_constructor: 1,
},
},
},
contract_versions: ContractVersions {
Expand Down
8 changes: 6 additions & 2 deletions packages/rs-platform-version/src/version/v4.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ use crate::version::dpp_versions::{
DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, DocumentTypeMethodVersions,
DocumentTypeSchemaVersions, DocumentTypeValidationVersions, DocumentTypeVersions,
DocumentVersions, DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions,
IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions,
IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
IdentityCreditWithdrawalTransitionVersions, IdentityKeyTypeMethodVersions,
IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions,
JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions,
RecursiveSchemaValidatorVersions, StateTransitionConversionVersions,
StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions,
VotingValidationVersions, VotingVersions,
Expand Down Expand Up @@ -1184,6 +1185,9 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion {
validate_asset_lock_transaction_structure: 0,
validate_instant_asset_lock_proof_structure: 0,
},
credit_withdrawal: IdentityCreditWithdrawalTransitionVersions {
default_constructor: 1,
},
},
},
contract_versions: ContractVersions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module.exports = function getIdentityCreditWithdrawalTransitionFixture() {
const privateKey = new PrivateKey('cSBnVM4xvxarwGQuAfQFwqDg9k5tErHUHzgWsEfD4zdwUasvqRVY');
const address = privateKey.toAddress();

const stateTransition = new IdentityCreditWithdrawalTransition(1);
const stateTransition = new IdentityCreditWithdrawalTransition(3);
stateTransition.setIdentityId(generateRandomIdentifier());
// eslint-disable-next-line
stateTransition.setAmount(BigInt(1000));
Expand Down
4 changes: 2 additions & 2 deletions packages/wasm-dpp/src/identity/identity_facade.rs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ impl IdentityFacadeWasm {
amount: u64,
core_fee_per_byte: u32,
pooling: u8,
output_script: Vec<u8>,
output_script: Option<Vec<u8>>,
identity_nonce: u64,
) -> Result<IdentityCreditWithdrawalTransitionWasm, JsValue> {
let pooling = match pooling {
Expand All @@ -222,7 +222,7 @@ impl IdentityFacadeWasm {
amount,
core_fee_per_byte,
pooling,
CoreScript::from_bytes(output_script),
output_script.map(CoreScript::from_bytes),
identity_nonce as IdentityNonce,
)
.map(Into::into)
Expand Down
4 changes: 2 additions & 2 deletions packages/wasm-dpp/src/identity/identity_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ impl IdentityFactoryWasm {
amount: u64,
core_fee_per_byte: u32,
pooling: u8,
output_script: Vec<u8>,
output_script: Option<Vec<u8>>,
identity_nonce: u64,
) -> Result<IdentityCreditWithdrawalTransitionWasm, JsValue> {
let pooling = match pooling {
Expand All @@ -226,7 +226,7 @@ impl IdentityFactoryWasm {
amount,
core_fee_per_byte,
pooling,
CoreScript::from_bytes(output_script),
output_script.map(CoreScript::from_bytes),
identity_nonce as IdentityNonce,
)
.map(Into::into)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ describe('IdentityFacade', () => {
beforeEach(async () => {
dpp = new DashPlatformProtocol(
{ generate: () => crypto.randomBytes(32) },
1,
3,
);

const chainAssetLockProofJS = getChainAssetLockProofFixture();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe('IdentityFactory', () => {

// const identityValidator = new IdentityValidator(blsAdapter);

factory = new IdentityFactory(1);
factory = new IdentityFactory(3);

identity = await getIdentityFixture(instantAssetLockProof.createIdentifier());
identity.setBalance(0);
Expand Down
Loading

0 comments on commit 8773afa

Please sign in to comment.