Skip to content

Commit 136df12

Browse files
committed
feat(sdk-coin-sui): support stake many
Ticket: EA-549 BREAKING CHANGE
1 parent 5ea79d7 commit 136df12

File tree

7 files changed

+122
-71
lines changed

7 files changed

+122
-71
lines changed

modules/sdk-coin-sui/src/lib/stakingBuilder.ts

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { TransferTransaction } from './transferTransaction';
1515
import { StakingTransaction } from './stakingTransaction';
1616
import {
1717
TransactionBlock as ProgrammingTransactionBlockBuilder,
18-
TransactionBlockInput,
1918
MoveCallTransaction,
2019
Inputs,
2120
} from './mystenlab/builder';
@@ -29,7 +28,7 @@ import {
2928
import { BCS } from '@mysten/bcs';
3029

3130
export class StakingBuilder extends TransactionBuilder<StakingProgrammableTransaction> {
32-
protected _addStakeTx: RequestAddStake;
31+
protected _addStakeTx: RequestAddStake[];
3332
protected _withdrawDelegation: RequestWithdrawStakedSui;
3433

3534
constructor(_coinConfig: Readonly<CoinConfig>) {
@@ -81,15 +80,17 @@ export class StakingBuilder extends TransactionBuilder<StakingProgrammableTransa
8180
/**
8281
* Create a new transaction for staking coins ready to be signed and executed.
8382
*
84-
* @param {RequestAddStake} request
83+
* @param {RequestAddStake[]} request: a list of staking request
8584
*/
86-
stake(request: RequestAddStake): this {
87-
utils.validateAddress(request.validatorAddress, 'validatorAddress');
88-
assert(utils.isValidAmount(request.amount), 'Invalid recipient amount');
89-
90-
if (this._sender === request.validatorAddress) {
91-
throw new BuildTransactionError('Sender address cannot be the same as the Staking address');
92-
}
85+
stake(request: RequestAddStake[]): this {
86+
request.forEach((req) => {
87+
utils.validateAddress(req.validatorAddress, 'validatorAddress');
88+
assert(utils.isValidAmount(req.amount), 'Invalid recipient amount');
89+
90+
if (this._sender === req.validatorAddress) {
91+
throw new BuildTransactionError('Sender address cannot be the same as the Staking address');
92+
}
93+
});
9394

9495
this._addStakeTx = request;
9596
return this;
@@ -149,19 +150,8 @@ export class StakingBuilder extends TransactionBuilder<StakingProgrammableTransa
149150
this.sender(txData.sender);
150151
this.gasData(txData.gasData);
151152

152-
const amountInputIdx = (
153-
(txData.kind.ProgrammableTransaction.transactions[1] as MoveCallTransaction).arguments[1] as TransactionBlockInput
154-
).index;
155-
const amount = utils.getAmount(txData.kind.ProgrammableTransaction.inputs[amountInputIdx] as TransactionBlockInput);
156-
157-
const validatorAddressInputIdx = (
158-
(txData.kind.ProgrammableTransaction.transactions[1] as MoveCallTransaction).arguments[2] as TransactionBlockInput
159-
).index;
160-
const validatorAddress = utils.getAddress(
161-
txData.kind.ProgrammableTransaction.inputs[validatorAddressInputIdx] as TransactionBlockInput
162-
);
163-
164-
this.stake({ amount, validatorAddress });
153+
const requests = utils.getStakeRequests(tx.suiTransaction.tx);
154+
this.stake(requests);
165155
}
166156

167157
/**
@@ -170,11 +160,10 @@ export class StakingBuilder extends TransactionBuilder<StakingProgrammableTransa
170160
private validateTransactionFields(): void {
171161
assert(this._type, new BuildTransactionError('type is required before building'));
172162
assert(this._sender, new BuildTransactionError('sender is required before building'));
173-
assert(
174-
this._addStakeTx.validatorAddress,
175-
new BuildTransactionError('validator address is required before building')
176-
);
177-
assert(this._addStakeTx.amount, new BuildTransactionError('staking amount is required before building'));
163+
this._addStakeTx.forEach((req) => {
164+
assert(req.validatorAddress, new BuildTransactionError('validator address is required before building'));
165+
assert(req.amount, new BuildTransactionError('staking amount is required before building'));
166+
});
178167
assert(this._gasData, new BuildTransactionError('gasData is required before building'));
179168
this.validateGasData(this._gasData);
180169
}
@@ -192,18 +181,20 @@ export class StakingBuilder extends TransactionBuilder<StakingProgrammableTransa
192181
switch (this._type) {
193182
case SuiTransactionType.AddStake:
194183
// Create a new coin with staking balance, based on the coins used as gas payment.
195-
const coin = programmableTxBuilder.splitCoins(programmableTxBuilder.gas, [
196-
programmableTxBuilder.pure(this._addStakeTx.amount),
197-
]);
198-
// Stake the split coin to a specific validator address.
199-
programmableTxBuilder.moveCall({
200-
target: `${SUI_SYSTEM_ADDRESS}::${SUI_SYSTEM_MODULE_NAME}::${ADD_STAKE_FUN_NAME}`,
201-
arguments: [
202-
programmableTxBuilder.object(Inputs.SharedObjectRef(SUI_SYSTEM_STATE_OBJECT)),
203-
coin,
204-
programmableTxBuilder.pure(Inputs.Pure(this._addStakeTx.validatorAddress, BCS.ADDRESS)),
205-
],
206-
} as MoveCallTransaction);
184+
this._addStakeTx.forEach((req) => {
185+
const coin = programmableTxBuilder.splitCoins(programmableTxBuilder.gas, [
186+
programmableTxBuilder.pure(req.amount),
187+
]);
188+
// Stake the split coin to a specific validator address.
189+
programmableTxBuilder.moveCall({
190+
target: `${SUI_SYSTEM_ADDRESS}::${SUI_SYSTEM_MODULE_NAME}::${ADD_STAKE_FUN_NAME}`,
191+
arguments: [
192+
programmableTxBuilder.object(Inputs.SharedObjectRef(SUI_SYSTEM_STATE_OBJECT)),
193+
coin,
194+
programmableTxBuilder.pure(Inputs.Pure(req.validatorAddress, BCS.ADDRESS)),
195+
],
196+
} as MoveCallTransaction);
197+
});
207198
break;
208199
case SuiTransactionType.WithdrawStake:
209200
// Unstake staked object.

modules/sdk-coin-sui/src/lib/stakingTransaction.ts

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -127,30 +127,19 @@ export class StakingTransaction extends Transaction<StakingProgrammableTransacti
127127
if (!this.suiTransaction) {
128128
return;
129129
}
130-
131-
const amountInputIdx = (
132-
(this.suiTransaction.tx.transactions[0] as SplitCoinsTransaction).amounts[0] as TransactionBlockInput
133-
).index;
134-
const amount = utils.getAmount(this.suiTransaction.tx.inputs[amountInputIdx] as TransactionBlockInput);
135-
136-
const validatorAddressInputIdx = (
137-
(this.suiTransaction.tx.transactions[1] as MoveCallTransaction).arguments[2] as TransactionBlockInput
138-
).index;
139-
const validatorAddress = utils.getAddress(
140-
this.suiTransaction.tx.inputs[validatorAddressInputIdx] as TransactionBlockInput
141-
);
142-
143-
this._outputs = [
144-
{
145-
address: validatorAddress,
146-
value: Number(amount).toString(),
130+
const requests = utils.getStakeRequests(this.suiTransaction.tx);
131+
this._outputs = requests.map((request) => {
132+
return {
133+
address: request.validatorAddress,
134+
value: request.amount.toString(),
147135
coin: this._coinConfig.name,
148-
},
149-
];
136+
};
137+
});
138+
150139
this._inputs = [
151140
{
152141
address: this.suiTransaction.sender,
153-
value: Number(amount).toString(),
142+
value: this._outputs.reduce((acc, output) => acc + Number(output.value), 0).toString(),
154143
coin: this._coinConfig.name,
155144
},
156145
];

modules/sdk-coin-sui/src/lib/utils.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
SuiTransactionType,
1818
TransferProgrammableTransaction,
1919
StakingProgrammableTransaction,
20+
RequestAddStake,
2021
} from './iface';
2122
import { Buffer } from 'buffer';
2223
import {
@@ -28,7 +29,9 @@ import {
2829
} from './mystenlab/types';
2930
import {
3031
builder,
32+
MoveCallTransaction,
3133
ObjectCallArg,
34+
SplitCoinsTransaction,
3235
TransactionBlockInput,
3336
TransactionType as TransactionCommandType,
3437
} from './mystenlab/builder';
@@ -236,6 +239,35 @@ export class Utils implements BaseUtils {
236239
});
237240
}
238241

242+
/**
243+
* Get add staking requests
244+
*
245+
* @param {StakingProgrammableTransaction} tx: staking transaction object
246+
* @return {RequestAddStake[]} add staking requests
247+
*/
248+
getStakeRequests(tx: StakingProgrammableTransaction): RequestAddStake[] {
249+
const amounts: number[] = [];
250+
const addresses: string[] = [];
251+
tx.transactions.forEach((transaction, i) => {
252+
if (transaction.kind === 'SplitCoins') {
253+
const amountInputIdx = ((transaction as SplitCoinsTransaction).amounts[0] as TransactionBlockInput).index;
254+
amounts.push(utils.getAmount(tx.inputs[amountInputIdx] as TransactionBlockInput));
255+
}
256+
if (transaction.kind === 'MoveCall') {
257+
const validatorAddressInputIdx = ((transaction as MoveCallTransaction).arguments[2] as TransactionBlockInput)
258+
.index;
259+
const validatorAddress = utils.getAddress(tx.inputs[validatorAddressInputIdx] as TransactionBlockInput);
260+
addresses.push(validatorAddress);
261+
}
262+
});
263+
return addresses.map((address, index) => {
264+
return {
265+
validatorAddress: address,
266+
amount: amounts[index],
267+
} as RequestAddStake;
268+
});
269+
}
270+
239271
getAmount(input: SuiJsonValue | TransactionBlockInput): number {
240272
return isPureArg(input)
241273
? builder.de(BCS.U64, Buffer.from(input.Pure).toString('base64'), 'base64')

modules/sdk-coin-sui/test/local_fullnode/transactions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ describe('Sui Transaction Types', function () {
194194
const txb = builder
195195
.type(SuiTransactionType.AddStake)
196196
.sender(keyPair.getAddress())
197-
.stake({ amount, validatorAddress: validator })
197+
.stake([{ amount, validatorAddress: validator }])
198198
.gasData(await getDefaultGasData(keyPair));
199199

200200
await signAndSubmit(conn, keyPair, txb);

modules/sdk-coin-sui/test/resources/sui.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,8 @@ export const INVALID_RAW_TX =
360360
'AAAAAAAAAAAAA6e7361637469bc4a58e500b9e64cb6547ee9b403000000000000002064ba1fb2f2fbd2938a350015d601f4db89cd7e8e2370d0dd9ae3ac4f635c1581111b8a49f67370bc4a58e500b9e64cb6462e39b802000000000000002064ba1fb2f2fbd2938a350015d601f4db89cd7e8e2370d0dd9ae3ac47aa1ff81f01c4173a804406a365e69dfb297d4eaaf002546ebd016400000000000000cba4a48bb0f8b586c167e5dcefaa1c5e96ab3f0836d6ca08f2081732944d1e5b6b406a4a462e39b8030000000000000020b9490ede63215262c434e03f606d9799f3ba704523ceda184b386d47aa1ff81f01000000000000006400000000000000';
361361
export const ADD_STAKE =
362362
'AAADAAgALTEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAEAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjAgIAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACAAABAgCYghiLo+gHCpuwaulEbPYHkU7o7ljtgwaj46//Whu7cQIJxAUirtVLzs+kg2BcXaWCGxcawaobYVlx+43+J+0T/VEEAAAAAAAAILZEZ8lcLtxXB9dIMp0rBAH+s8LT/e12XMNKiaW4bnuyJ90A5/zNyHtNlbY4S3ORGbkfKoGha67ep/TgBo5SlDfZAAAAAAAAACC+KT7TKlmOYLySRsTgG25Ck38WiZCIOmogUHrCwU0nJ5iCGIuj6AcKm7Bq6URs9geRTujuWO2DBqPjr/9aG7tx6AMAAAAAAAAALTEBAAAAAAA=';
363+
export const STAKE_MANY =
364+
'AAAJAAgALTEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAEAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjAAgArCP8BgAAAAAgRLGzGeI0lZlfyDfa/Sj8avi2Re3d/w/BRn8a1jE2LCYACAAtMQEAAAAAACBEsbMZ4jSVmV/IN9r9KPxq+LZF7d3/D8FGfxrWMTYsJgAIAKwj/AYAAAAAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjCAIAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACAAABAgACAAEBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRFyZXF1ZXN0X2FkZF9zdGFrZQADAQEAAgIAAQQAAgABAQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCnN1aV9zeXN0ZW0RcmVxdWVzdF9hZGRfc3Rha2UAAwEBAAIEAAEGAAIAAQEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACBgABCACYghiLo+gHCpuwaulEbPYHkU7o7ljtgwaj46//Whu7cQIJxAUirtVLzs+kg2BcXaWCGxcawaobYVlx+43+J+0T/VEEAAAAAAAAILZEZ8lcLtxXB9dIMp0rBAH+s8LT/e12XMNKiaW4bnuyJ90A5/zNyHtNlbY4S3ORGbkfKoGha67ep/TgBo5SlDfZAAAAAAAAACC+KT7TKlmOYLySRsTgG25Ck38WiZCIOmogUHrCwU0nJ5iCGIuj6AcKm7Bq6URs9geRTujuWO2DBqPjr/9aG7tx6AMAAAAAAAAALTEBAAAAAAA=';
363365
export const WITHDRAW_STAKED_SUI =
364366
'AAACAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQEAAAAAAAAAAQEA7m38PaMuIVQaKurfzSUPigoju3q9qciYhAf8MgaMN0ZhBAAAAAAAACDJYCWUFis6HawzxGyErvRT03pYayRliLki0kYsV0XCBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlAAIBAAABAQCYghiLo+gHCpuwaulEbPYHkU7o7ljtgwaj46//Whu7cQIJxAUirtVLzs+kg2BcXaWCGxcawaobYVlx+43+J+0T/VEEAAAAAAAAILZEZ8lcLtxXB9dIMp0rBAH+s8LT/e12XMNKiaW4bnuyJ90A5/zNyHtNlbY4S3ORGbkfKoGha67ep/TgBo5SlDfZAAAAAAAAACC+KT7TKlmOYLySRsTgG25Ck38WiZCIOmogUHrCwU0nJ5iCGIuj6AcKm7Bq6URs9geRTujuWO2DBqPjr/9aG7tx6AMAAAAAAAAALTEBAAAAAAA=';
365367

@@ -381,11 +383,34 @@ export const STAKING_AMOUNT = 20000000;
381383

382384
export const VALIDATOR_ADDRESS = '0x44b1b319e23495995fc837dafd28fc6af8b645edddff0fc1467f1ad631362c23';
383385

386+
export const STAKING_AMOUNT_2 = 30000000000;
387+
388+
export const VALIDATOR_ADDRESS_2 = '0x44b1b319e23495995fc837dafd28fc6af8b645edddff0fc1467f1ad631362c26';
389+
384390
export const requestAddStake: RequestAddStake = {
385391
amount: STAKING_AMOUNT,
386392
validatorAddress: VALIDATOR_ADDRESS,
387393
};
388394

395+
export const requestAddStakeMany: RequestAddStake[] = [
396+
{
397+
amount: STAKING_AMOUNT,
398+
validatorAddress: VALIDATOR_ADDRESS,
399+
},
400+
{
401+
amount: STAKING_AMOUNT_2,
402+
validatorAddress: VALIDATOR_ADDRESS_2,
403+
},
404+
{
405+
amount: STAKING_AMOUNT,
406+
validatorAddress: VALIDATOR_ADDRESS_2,
407+
},
408+
{
409+
amount: STAKING_AMOUNT_2,
410+
validatorAddress: VALIDATOR_ADDRESS,
411+
},
412+
];
413+
389414
export const requestWithdrawStakedSui: RequestWithdrawStakedSui = {
390415
stakedSui: {
391416
objectId: '0xee6dfc3da32e21541a2aeadfcd250f8a0a23bb7abda9c8988407fc32068c3746',

modules/sdk-coin-sui/test/unit/transactionBuilder/stakingBuilder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ describe('Sui Staking Builder', () => {
1414
const txBuilder = factory.getStakingBuilder();
1515
txBuilder.type(SuiTransactionType.AddStake);
1616
txBuilder.sender(testData.sender.address);
17-
txBuilder.stake(testData.requestAddStake);
17+
txBuilder.stake([testData.requestAddStake]);
1818
txBuilder.gasData(testData.gasData);
1919
const tx = await txBuilder.build();
2020
should.equal(tx.type, TransactionType.StakingAdd);

modules/sdk-coin-sui/test/unit/transactionBuilder/transactionBuilder.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,27 @@ describe('Sui Transaction Builder', async () => {
270270
const txBuilder = factory.getStakingBuilder();
271271
txBuilder.type(SuiTransactionType.AddStake);
272272
txBuilder.sender(testData.sender.address);
273-
txBuilder.stake(testData.requestAddStake);
273+
txBuilder.stake([testData.requestAddStake]);
274274
txBuilder.gasData(testData.gasData);
275275
const tx = await txBuilder.build();
276276
should.equal(tx.type, TransactionType.StakingAdd);
277277
const rawTx = tx.toBroadcastFormat();
278278
should.equal(rawTx, testData.ADD_STAKE);
279279
const reserialized = await factory.from(rawTx).build();
280+
reserialized.toBroadcastFormat().should.equal(rawTx);
281+
});
282+
283+
it('should build an stakeMany transaction and serialize it and deserialize it', async function () {
284+
const txBuilder = factory.getStakingBuilder();
285+
txBuilder.type(SuiTransactionType.AddStake);
286+
txBuilder.sender(testData.sender.address);
287+
txBuilder.stake(testData.requestAddStakeMany);
288+
txBuilder.gasData(testData.gasData);
289+
const tx = await txBuilder.build();
290+
should.equal(tx.type, TransactionType.StakingAdd);
291+
const rawTx = tx.toBroadcastFormat();
292+
should.equal(rawTx, testData.STAKE_MANY);
293+
const reserialized = await factory.from(rawTx).build();
280294
// reserialized.should.be.deepEqual(tx);
281295
reserialized.toBroadcastFormat().should.equal(rawTx);
282296
});
@@ -285,7 +299,7 @@ describe('Sui Transaction Builder', async () => {
285299
const txBuilder = factory.getStakingBuilder();
286300
txBuilder.type(SuiTransactionType.AddStake);
287301
txBuilder.sender(testData.sender.address);
288-
txBuilder.stake(testData.requestAddStake);
302+
txBuilder.stake([testData.requestAddStake]);
289303
txBuilder.gasData(testData.gasData);
290304
const tx = await txBuilder.build();
291305
should.equal(tx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
@@ -312,9 +326,9 @@ describe('Sui Transaction Builder', async () => {
312326
const keyPairSender = new KeyPair({ prv: testData.privateKeys.prvKey1 });
313327
const senderAddress = keyPairSender.getAddress();
314328
const expectedStakingTxSig =
315-
'AIyRgcm//edb10JKGtf0LdgR6AlFesXycRAGhMZHm1cisZSAijp/5n3yxuJ/GHOWj9TbamznigxLfPMVPZh9pQ2lzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
329+
'AD8755e+kA3/Iy+3oRxBbQiK0Iz4qmD4sZcpoQN0UMPxIXv7Qx4twvuAiZf9H2nHYa/Ae0asM4Rkz1SCP0dhXgqlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
316330
const expectedStakingTxHex =
317-
'AAADAAgALTEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAEAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjAgIAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACAAABAgCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
331+
'AAAJAAgALTEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAEAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjAAgArCP8BgAAAAAgRLGzGeI0lZlfyDfa/Sj8avi2Re3d/w/BRn8a1jE2LCYACAAtMQEAAAAAACBEsbMZ4jSVmV/IN9r9KPxq+LZF7d3/D8FGfxrWMTYsJgAIAKwj/AYAAAAAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjCAIAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACAAABAgACAAEBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRFyZXF1ZXN0X2FkZF9zdGFrZQADAQEAAgIAAQQAAgABAQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCnN1aV9zeXN0ZW0RcmVxdWVzdF9hZGRfc3Rha2UAAwEBAAIEAAEGAAIAAQEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACBgABCACQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
318332

319333
const coins = [
320334
{
@@ -331,7 +345,7 @@ describe('Sui Transaction Builder', async () => {
331345
const txBuilder_1 = factory.getStakingBuilder();
332346
txBuilder_1.type(SuiTransactionType.AddStake);
333347
txBuilder_1.sender(senderAddress);
334-
txBuilder_1.stake(testData.requestAddStake);
348+
txBuilder_1.stake(testData.requestAddStakeMany);
335349
const gasData: GasData = {
336350
payment: coins,
337351
owner: senderAddress,
@@ -368,7 +382,7 @@ describe('Sui Transaction Builder', async () => {
368382
it('should fail to build if missing type', async function () {
369383
for (const txBuilder of builders) {
370384
txBuilder.sender(testData.sender.address);
371-
txBuilder.stake(testData.requestAddStake);
385+
txBuilder.stake([testData.requestAddStake]);
372386
txBuilder.gasData(testData.gasData);
373387
await txBuilder.build().should.rejectedWith('type is required before building');
374388
}
@@ -377,7 +391,7 @@ describe('Sui Transaction Builder', async () => {
377391
it('should fail to build if missing sender', async function () {
378392
for (const txBuilder of builders) {
379393
txBuilder.type(SuiTransactionType.AddStake);
380-
txBuilder.stake(testData.requestAddStake);
394+
txBuilder.stake([testData.requestAddStake]);
381395
txBuilder.gasData(testData.gasData);
382396
await txBuilder.build().should.rejectedWith('sender is required before building');
383397
}
@@ -387,7 +401,7 @@ describe('Sui Transaction Builder', async () => {
387401
for (const txBuilder of builders) {
388402
txBuilder.sender(testData.sender.address);
389403
txBuilder.type(SuiTransactionType.AddStake);
390-
txBuilder.stake(testData.requestAddStake);
404+
txBuilder.stake([testData.requestAddStake]);
391405
await txBuilder.build().should.rejectedWith('gasData is required before building');
392406
}
393407
});
@@ -396,7 +410,7 @@ describe('Sui Transaction Builder', async () => {
396410
for (const txBuilder of builders) {
397411
txBuilder.sender(testData.sender.address);
398412
txBuilder.type(SuiTransactionType.AddStake);
399-
txBuilder.stake(testData.requestAddStake);
413+
txBuilder.stake([testData.requestAddStake]);
400414
should(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(
401415
`gas payment is required before building`
402416
);

0 commit comments

Comments
 (0)