Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions modules/sdk-coin-sui/src/lib/walrusWithdrawStakeBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,11 @@ export class WalrusWithdrawStakeBuilder extends TransactionBuilder<WalrusWithdra
this.type(tx.suiTransaction.type);
this.sender(txData.sender);
this.gasData(txData.gasData);

if (txData.expiration && !('None' in txData.expiration)) {
this._expiration = txData.expiration;
}

const parsed = utils.getWalrusWithdrawStakeRequests(tx.suiTransaction.tx);
this.requestWithdrawStake({
stakedWal: {
Expand Down Expand Up @@ -194,6 +199,7 @@ export class WalrusWithdrawStakeBuilder extends TransactionBuilder<WalrusWithdra
...this._gasData,
payment: this._gasData.payment.slice(0, MAX_GAS_OBJECTS - 1),
},
expiration: this._expiration,
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export class WalrusWithdrawStakeTransaction extends Transaction<WalrusWithdrawSt
sender: tx.sender,
kind: { ProgrammableTransaction: tx.tx },
gasData: tx.gasData,
expiration: { None: null },
expiration: tx.expiration ?? { None: null },
inputObjects: [utils.getWalrusWithdrawStakeRequests(tx.tx).stakedWal],
};
}
Expand Down Expand Up @@ -186,7 +186,7 @@ export class WalrusWithdrawStakeTransaction extends Transaction<WalrusWithdrawSt

return {
sender: this._suiTransaction.sender,
expiration: { None: null },
expiration: this._suiTransaction.expiration ?? { None: null },
gasData: this._suiTransaction.gasData,
kind: {
ProgrammableTransaction: programmableTx,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,14 @@ describe('Walrus Withdraw Builder', () => {
value: AMOUNT_UNKNOWN_TEXT,
coin: 'tsui:wal',
});
tx.toJson().expiration.should.deepEqual({ None: null });

const rawTx = tx.toBroadcastFormat();
await assertRebuild(rawTx);

const rebuiltForExpiration = await factory.from(rawTx).build();
rebuiltForExpiration.toJson().expiration.should.deepEqual({ None: null });

tx.suiTransaction.gasData.owner.should.equal(testData.gasData.owner);
tx.suiTransaction.gasData.price.should.equal(testData.gasData.price);
tx.suiTransaction.gasData.budget.should.equal(testData.gasData.budget);
Expand All @@ -131,6 +135,80 @@ describe('Walrus Withdraw Builder', () => {
(ptb.transactions[0] as MoveCallTransaction).target.should.endWith('::staking::withdraw_stake');
ptb.transactions[1].kind.should.equal('TransferObjects');
});

it('should round-trip ValidDuring expiration on a request withdraw tx', async function () {
const GENESIS_CHAIN_ID = 'GAFpCCcRCxTdFfUEMbQbkLBaZy2RNiGAfvFBhMNpq2kT';
const txBuilder = factory.getWalrusRequestWithdrawStakeBuilder();
txBuilder.type(SuiTransactionType.WalrusRequestWithdrawStake);
txBuilder.sender(testData.sender.address);
txBuilder.requestWithdrawStake(testData.requestWalrusWithdrawFull);
txBuilder.gasData(testData.gasData);
txBuilder.expiration({
ValidDuring: {
minEpoch: { Some: 1156 },
maxEpoch: { Some: 1157 },
minTimestamp: { None: null },
maxTimestamp: { None: null },
chain: GENESIS_CHAIN_ID,
nonce: 12345678,
},
});

const tx = await txBuilder.build();
const validDuring = (tx.toJson().expiration as any)?.ValidDuring;
should.exist(validDuring, 'ValidDuring expiration must be set when building');
Number(validDuring.minEpoch.Some).should.equal(1156);
Number(validDuring.maxEpoch.Some).should.equal(1157);

const rawTx = tx.toBroadcastFormat();
await assertRebuild(rawTx);

const rebuilder = factory.from(rawTx);
const rebuiltTx = await rebuilder.build();
const rebuiltValidDuring = (rebuiltTx.toJson().expiration as any)?.ValidDuring;
should.exist(rebuiltValidDuring, 'ValidDuring expiration must survive from(raw) restore');
Number(rebuiltValidDuring.minEpoch.Some).should.equal(1156);
Number(rebuiltValidDuring.maxEpoch.Some).should.equal(1157);
rebuiltValidDuring.chain.should.equal(GENESIS_CHAIN_ID);
Number(rebuiltValidDuring.nonce).should.equal(12345678);
});

it('should round-trip ValidDuring expiration on a withdraw tx', async function () {
const GENESIS_CHAIN_ID = 'GAFpCCcRCxTdFfUEMbQbkLBaZy2RNiGAfvFBhMNpq2kT';
const txBuilder = factory.getWalrusRequestWithdrawStakeBuilder();
txBuilder.type(SuiTransactionType.WalrusWithdrawStake);
txBuilder.sender(testData.sender.address);
txBuilder.requestWithdrawStake(testData.requestWalrusWithdrawFull);
txBuilder.gasData(testData.gasData);
txBuilder.expiration({
ValidDuring: {
minEpoch: { Some: 2000 },
maxEpoch: { Some: 2001 },
minTimestamp: { None: null },
maxTimestamp: { None: null },
chain: GENESIS_CHAIN_ID,
nonce: 87654321,
},
});

const tx = await txBuilder.build();
const validDuring = (tx.toJson().expiration as any)?.ValidDuring;
should.exist(validDuring, 'ValidDuring expiration must be set when building');
Number(validDuring.minEpoch.Some).should.equal(2000);
Number(validDuring.maxEpoch.Some).should.equal(2001);

const rawTx = tx.toBroadcastFormat();
await assertRebuild(rawTx);

const rebuilder = factory.from(rawTx);
const rebuiltTx = await rebuilder.build();
const rebuiltValidDuring = (rebuiltTx.toJson().expiration as any)?.ValidDuring;
should.exist(rebuiltValidDuring, 'ValidDuring expiration must survive from(raw) restore');
Number(rebuiltValidDuring.minEpoch.Some).should.equal(2000);
Number(rebuiltValidDuring.maxEpoch.Some).should.equal(2001);
rebuiltValidDuring.chain.should.equal(GENESIS_CHAIN_ID);
Number(rebuiltValidDuring.nonce).should.equal(87654321);
});
});

describe('Fail', () => {
Expand Down
Loading