From b276a61e54152d25e0741d2cf389afcfef78851b Mon Sep 17 00:00:00 2001 From: parodyBit <58690522+parodyBit@users.noreply.github.com> Date: Mon, 27 May 2024 06:47:49 -0600 Subject: [PATCH] fix: stake / unstake schema --- example/stake_transaction_example.dart | 15 +++++++- lib/src/schema/public_key.dart | 4 ++ lib/src/schema/stake_body.dart | 2 +- lib/src/schema/stake_key.dart | 3 +- lib/src/schema/stake_output.dart | 19 ++++------ lib/src/schema/transaction.dart | 49 ++++++++++++++++++++++++- lib/src/schema/unstake_transaction.dart | 3 +- 7 files changed, 77 insertions(+), 18 deletions(-) diff --git a/example/stake_transaction_example.dart b/example/stake_transaction_example.dart index fde8700..1d04ddd 100644 --- a/example/stake_transaction_example.dart +++ b/example/stake_transaction_example.dart @@ -29,6 +29,12 @@ void main() async { /// The authorization by the node KeyedSignature authorization = signHash(pkh, masterNode.privateKey); + /// Build the Stake Key + StakeKey stakeKey = StakeKey( + validator: authorization.publicKey.pkh, + withdrawer: PublicKeyHash.fromAddress(withdrawer.address.address), + ); + /// build stake transaction body StakeBody body = StakeBody( inputs: [ @@ -36,6 +42,7 @@ void main() async { ], output: StakeOutput( value: MINIMUM_STAKEABLE_AMOUNT_WITS, + key: stakeKey, authorization: authorization, ), ); @@ -52,8 +59,12 @@ void main() async { /// var response = await nodeClient.inventory(stake.jsonMap()); /// UnstakeBody unstakeBody = UnstakeBody( - operator: PublicKeyHash.fromAddress(""), - withdrawal: ValueTransferOutput.fromJson({})); + operator: PublicKeyHash.fromAddress(withdrawer.address.address), + withdrawal: ValueTransferOutput.fromJson({ + "pkh": withdrawer.address.address, + "time_lock": 0, + "value": 1, + })); KeyedSignature unstakeSignature = signHash(bytesToHex(unstakeBody.hash), masterNode.privateKey); diff --git a/lib/src/schema/public_key.dart b/lib/src/schema/public_key.dart index f157650..0bd44b7 100644 --- a/lib/src/schema/public_key.dart +++ b/lib/src/schema/public_key.dart @@ -64,6 +64,10 @@ class PublicKey extends GeneratedMessage { Uint8List get pbBytes => writeToBuffer(); + PublicKeyHash get pkh => PublicKeyHash( + hash: sha256(data: Uint8List.fromList(publicKey)).sublist(0, 20), + ); + @TagNumber(1) List get publicKey => $_getN(0); @TagNumber(1) diff --git a/lib/src/schema/stake_body.dart b/lib/src/schema/stake_body.dart index 3f7ed41..eac5f7f 100644 --- a/lib/src/schema/stake_body.dart +++ b/lib/src/schema/stake_body.dart @@ -5,7 +5,7 @@ class StakeBody extends GeneratedMessage { package: const PackageName('witnet'), createEmptyInstance: create) ..pc(1, 'inputs', PbFieldType.PM, subBuilder: Input.create) ..aOM(2, 'output', subBuilder: StakeOutput.create) - ..aOM(2, 'change', + ..aOM(3, 'change', subBuilder: ValueTransferOutput.create) ..hasRequiredFields = false; diff --git a/lib/src/schema/stake_key.dart b/lib/src/schema/stake_key.dart index 850877c..89a318c 100644 --- a/lib/src/schema/stake_key.dart +++ b/lib/src/schema/stake_key.dart @@ -1,6 +1,7 @@ part of 'schema.dart'; + class StakeKey extends GeneratedMessage { static final BuilderInfo _i = BuilderInfo('StakeOutput', package: const PackageName('witnet'), createEmptyInstance: create) @@ -58,7 +59,7 @@ class StakeKey extends GeneratedMessage { PublicKeyHash get validator => $_getN(1); @TagNumber(1) set validator(PublicKeyHash v) { - setField(0, v); + setField(1, v); } @TagNumber(1) diff --git a/lib/src/schema/stake_output.dart b/lib/src/schema/stake_output.dart index 763478f..0da3bbe 100644 --- a/lib/src/schema/stake_output.dart +++ b/lib/src/schema/stake_output.dart @@ -4,7 +4,7 @@ class StakeOutput extends GeneratedMessage { static final BuilderInfo _i = BuilderInfo('StakeOutput', package: const PackageName('witnet'), createEmptyInstance: create) ..a(1, 'value', PbFieldType.OU6, defaultOrMaker: Int64.ZERO) - ..aOM(2, 'key', subBuilder: PublicKeyHash.create) + ..aOM(2, 'key', subBuilder: StakeKey.create) ..aOM(3, 'authorization', subBuilder: KeyedSignature.create) ..hasRequiredFields = false; @@ -23,7 +23,7 @@ class StakeOutput extends GeneratedMessage { factory StakeOutput({ int? value, - PublicKeyHash? key, + StakeKey? key, KeyedSignature? authorization, }) { final _result = create(); @@ -47,14 +47,13 @@ class StakeOutput extends GeneratedMessage { @override factory StakeOutput.fromJson(Map json) => StakeOutput( value: json["value"], - - key: PublicKeyHash.fromAddress(json["key"]), + key: StakeKey.fromJson(json["key"]), authorization: KeyedSignature.fromJson(json["authorization"]), ); Map jsonMap({bool asHex = false}) => { "value": value.toInt(), - "key": key.address, + "key": key.jsonMap(asHex: asHex), "authorization": authorization.jsonMap(asHex: asHex), }; @@ -76,10 +75,9 @@ class StakeOutput extends GeneratedMessage { void clearValue() => clearField(1); @TagNumber(2) - PublicKeyHash get key => $_getN(2); + StakeKey get key => $_getN(2); @TagNumber(2) - set key(PublicKeyHash v) { - + set key(StakeKey v) { setField(2, v); } @@ -88,7 +86,7 @@ class StakeOutput extends GeneratedMessage { @TagNumber(2) void clearKey() => clearField(2); @TagNumber(2) - PublicKeyHash ensureKey() => $_ensure(1); + StakeKey ensureKey() => $_ensure(1); @TagNumber(3) KeyedSignature get authorization => $_getN(3); @@ -102,6 +100,5 @@ class StakeOutput extends GeneratedMessage { @TagNumber(3) void clearAuthorization() => clearField(3); @TagNumber(3) - PublicKeyHash ensureAuthorization() => $_ensure(2); - + KeyedSignature ensureAuthorization() => $_ensure(2); } diff --git a/lib/src/schema/transaction.dart b/lib/src/schema/transaction.dart index 4a64ac9..ecc9c6a 100644 --- a/lib/src/schema/transaction.dart +++ b/lib/src/schema/transaction.dart @@ -7,6 +7,8 @@ enum TransactionKind { reveal, tally, mint, + stake, + unstake, notSet } @@ -17,6 +19,8 @@ const Map _Transaction_KindByTag = { 4: TransactionKind.reveal, 5: TransactionKind.tally, 6: TransactionKind.mint, + 7: TransactionKind.stake, + 8: TransactionKind.unstake, 0: TransactionKind.notSet }; @@ -36,6 +40,10 @@ class Transaction extends GeneratedMessage { protoName: 'Tally', subBuilder: TallyTransaction.create) ..aOM(6, 'Mint', protoName: 'Mint', subBuilder: MintTransaction.create) + ..aOM(6, 'Mint', + protoName: 'Stake', subBuilder: StakeTransaction.create) + ..aOM(6, 'Mint', + protoName: 'Unstake', subBuilder: UnstakeTransaction.create) ..hasRequiredFields = false; static Transaction create() => Transaction._(); @@ -59,6 +67,8 @@ class Transaction extends GeneratedMessage { RevealTransaction? reveal, TallyTransaction? tally, MintTransaction? mint, + StakeTransaction? stake, + UnstakeTransaction? unstake, }) { final _result = create(); if (valueTransfer != null) { @@ -79,6 +89,12 @@ class Transaction extends GeneratedMessage { if (mint != null) { _result.mint = mint; } + if (stake != null) { + _result.stake = stake; + } + if (unstake != null) { + _result.unstake = unstake; + } return _result; } @@ -110,9 +126,12 @@ class Transaction extends GeneratedMessage { case 'Reveal': return Transaction( reveal: RevealTransaction.fromJson(_txn['Reveal'])); - case 'Tally': return Transaction(tally: TallyTransaction.fromJson(_txn['Tally'])); + case 'Stake': + return Transaction(stake: StakeTransaction.fromJson(_txn['Stake'])); + case 'Unstake': + return Transaction(unstake: UnstakeTransaction.fromJson(_txn['Unstake'])); } } else { throw ArgumentError('Invalid json'); @@ -250,4 +269,32 @@ class Transaction extends GeneratedMessage { void clearMint() => clearField(6); @TagNumber(6) MintTransaction ensureMint() => $_ensure(5); + + @TagNumber(7) + StakeTransaction get stake => $_getN(6); + @TagNumber(7) + set stake(StakeTransaction v) { + setField(7, v); + } + + @TagNumber(7) + bool hasStake() => $_has(6); + @TagNumber(7) + void clearStake() => clearField(7); + @TagNumber(7) + StakeTransaction ensureStake() => $_ensure(6); + + + @TagNumber(8) + UnstakeTransaction get unstake => $_getN(7); + @TagNumber(8) + set unstake(UnstakeTransaction v) { + setField(8, v); + } + @TagNumber(8) + bool hasUnstake() => $_has(7); + @TagNumber(8) + void clearUnstake() => clearField(8); + @TagNumber(8) + UnstakeTransaction ensureUnstake() => $_ensure(7); } diff --git a/lib/src/schema/unstake_transaction.dart b/lib/src/schema/unstake_transaction.dart index db23ea6..b01d7ed 100644 --- a/lib/src/schema/unstake_transaction.dart +++ b/lib/src/schema/unstake_transaction.dart @@ -6,8 +6,7 @@ class UnstakeTransaction extends GeneratedMessage { package: const PackageName('witnet'), createEmptyInstance: create) ..aOM(1, 'body', subBuilder: UnstakeBody.create) - ..pc(2, 'signature', PbFieldType.PM, - subBuilder: KeyedSignature.create) + ..aOM(2, 'signature', subBuilder: KeyedSignature.create) ..hasRequiredFields = false; static UnstakeTransaction create() => UnstakeTransaction._();