Skip to content

Commit 504ebdd

Browse files
feat: add schedule create/sign TCK endpoint (#3318)
Signed-off-by: Mario Dimitrov <[email protected]>
1 parent 9f63e3c commit 504ebdd

File tree

6 files changed

+390
-42
lines changed

6 files changed

+390
-42
lines changed

tck/methods/account.ts

Lines changed: 69 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ import {
3131
import { applyCommonTransactionParams } from "../params/common-tx-params";
3232
import { TransferCryptoParams } from "../params/transfer";
3333

34-
export const createAccount = async ({
34+
// buildCreateAccount builds an AccountCreateTransaction from parameters
35+
export const buildCreateAccount = ({
3536
key,
3637
initialBalance,
3738
receiverSignatureRequired,
@@ -43,7 +44,7 @@ export const createAccount = async ({
4344
memo,
4445
autoRenewPeriod,
4546
alias,
46-
}: CreateAccountParams): Promise<AccountResponse> => {
47+
}: CreateAccountParams): AccountCreateTransaction => {
4748
let transaction = new AccountCreateTransaction().setGrpcDeadline(
4849
DEFAULT_GRPC_DEADLINE,
4950
);
@@ -98,16 +99,25 @@ export const createAccount = async ({
9899
);
99100
}
100101

102+
return transaction;
103+
};
104+
105+
export const createAccount = async (
106+
params: CreateAccountParams,
107+
): Promise<AccountResponse> => {
108+
const transaction = buildCreateAccount(params);
109+
101110
const txResponse = await transaction.execute(sdk.getClient());
102111
const receipt = await txResponse.getReceipt(sdk.getClient());
103112

104113
return {
105-
accountId: receipt.accountId.toString(),
114+
accountId: receipt.accountId?.toString(),
106115
status: receipt.status.toString(),
107116
};
108117
};
109118

110-
export const updateAccount = async ({
119+
// buildUpdateAccount builds an AccountUpdateTransaction from parameters
120+
const buildUpdateAccount = ({
111121
accountId,
112122
key,
113123
autoRenewPeriod,
@@ -119,7 +129,7 @@ export const updateAccount = async ({
119129
stakedNodeId,
120130
declineStakingReward,
121131
commonTransactionParams,
122-
}: UpdateAccountParams): Promise<AccountResponse> => {
132+
}: UpdateAccountParams): AccountUpdateTransaction => {
123133
let transaction = new AccountUpdateTransaction().setGrpcDeadline(
124134
DEFAULT_GRPC_DEADLINE,
125135
);
@@ -176,6 +186,14 @@ export const updateAccount = async ({
176186
);
177187
}
178188

189+
return transaction;
190+
};
191+
192+
export const updateAccount = async (
193+
params: UpdateAccountParams,
194+
): Promise<AccountResponse> => {
195+
const transaction = buildUpdateAccount(params);
196+
179197
const txResponse = await transaction.execute(sdk.getClient());
180198
const receipt = await txResponse.getReceipt(sdk.getClient());
181199

@@ -184,11 +202,12 @@ export const updateAccount = async ({
184202
};
185203
};
186204

187-
export const deleteAccount = async ({
205+
// buildDeleteAccount builds an AccountDeleteTransaction from parameters
206+
const buildDeleteAccount = ({
188207
deleteAccountId,
189208
transferAccountId,
190209
commonTransactionParams,
191-
}: DeleteAccountParams): Promise<AccountResponse> => {
210+
}: DeleteAccountParams): AccountDeleteTransaction => {
192211
let transaction = new AccountDeleteTransaction().setGrpcDeadline(
193212
DEFAULT_GRPC_DEADLINE,
194213
);
@@ -211,6 +230,14 @@ export const deleteAccount = async ({
211230
);
212231
}
213232

233+
return transaction;
234+
};
235+
236+
export const deleteAccount = async (
237+
params: DeleteAccountParams,
238+
): Promise<AccountResponse> => {
239+
const transaction = buildDeleteAccount(params);
240+
214241
const txResponse = await transaction.execute(sdk.getClient());
215242
const receipt = await txResponse.getReceipt(sdk.getClient());
216243

@@ -219,10 +246,11 @@ export const deleteAccount = async ({
219246
};
220247
};
221248

222-
export const approveAllowance = async ({
249+
// buildApproveAllowance builds an AccountAllowanceApproveTransaction from parameters
250+
export const buildApproveAllowance = ({
223251
allowances,
224252
commonTransactionParams,
225-
}: AccountAllowanceApproveParams): Promise<AccountResponse> => {
253+
}: AccountAllowanceApproveParams): AccountAllowanceApproveTransaction => {
226254
const transaction = new AccountAllowanceApproveTransaction();
227255
transaction.setGrpcDeadline(DEFAULT_GRPC_DEADLINE);
228256

@@ -252,8 +280,6 @@ export const approveAllowance = async ({
252280
}
253281
}
254282

255-
transaction.freezeWith(sdk.getClient());
256-
257283
if (commonTransactionParams) {
258284
applyCommonTransactionParams(
259285
commonTransactionParams,
@@ -262,6 +288,14 @@ export const approveAllowance = async ({
262288
);
263289
}
264290

291+
return transaction;
292+
};
293+
294+
export const approveAllowance = async (
295+
params: AccountAllowanceApproveParams,
296+
): Promise<AccountResponse> => {
297+
const transaction = buildApproveAllowance(params);
298+
265299
const txResponse = await transaction.execute(sdk.getClient());
266300
const receipt = await txResponse.getReceipt(sdk.getClient());
267301

@@ -270,23 +304,21 @@ export const approveAllowance = async ({
270304
};
271305
};
272306

273-
export const deleteAllowance = async ({
307+
// buildDeleteAllowance builds an AccountAllowanceDeleteTransaction from parameters
308+
const buildDeleteAllowance = ({
274309
allowances,
275310
commonTransactionParams,
276-
}: DeleteAllowanceParams): Promise<AccountResponse> => {
311+
}: DeleteAllowanceParams): AccountAllowanceDeleteTransaction => {
277312
let transaction = new AccountAllowanceDeleteTransaction().setGrpcDeadline(
278313
DEFAULT_GRPC_DEADLINE,
279314
);
280315

281316
for (const allowance of allowances) {
282317
const owner = AccountId.fromString(allowance.ownerAccountId);
283-
const tokenId = AccountId.fromString(allowance.tokenId);
318+
const tokenId = TokenId.fromString(allowance.tokenId);
284319

285320
for (const serialNumber of allowance.serialNumbers) {
286-
const nftId = new NftId(
287-
new TokenId(tokenId),
288-
Long.fromString(serialNumber),
289-
);
321+
const nftId = new NftId(tokenId, Long.fromString(serialNumber));
290322

291323
transaction.deleteAllTokenNftAllowances(nftId, owner);
292324
}
@@ -300,6 +332,14 @@ export const deleteAllowance = async ({
300332
);
301333
}
302334

335+
return transaction;
336+
};
337+
338+
export const deleteAllowance = async (
339+
params: DeleteAllowanceParams,
340+
): Promise<AccountResponse> => {
341+
const transaction = buildDeleteAllowance(params);
342+
303343
const txResponse = await transaction.execute(sdk.getClient());
304344
const receipt = await txResponse.getReceipt(sdk.getClient());
305345

@@ -308,10 +348,11 @@ export const deleteAllowance = async ({
308348
};
309349
};
310350

311-
export const transferCrypto = async ({
351+
// buildTransferCrypto builds a TransferTransaction from parameters
352+
export const buildTransferCrypto = ({
312353
transfers,
313354
commonTransactionParams,
314-
}: TransferCryptoParams): Promise<AccountResponse> => {
355+
}: TransferCryptoParams): TransferTransaction => {
315356
if (!transfers.length) {
316357
throw new Error("No transfers provided.");
317358
}
@@ -403,6 +444,14 @@ export const transferCrypto = async ({
403444
);
404445
}
405446

447+
return transaction;
448+
};
449+
450+
export const transferCrypto = async (
451+
params: TransferCryptoParams,
452+
): Promise<AccountResponse> => {
453+
const transaction = buildTransferCrypto(params);
454+
406455
const txResponse = await transaction.execute(sdk.getClient());
407456
const receipt = await txResponse.getReceipt(sdk.getClient());
408457

tck/methods/schedule.ts

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
import {
2+
ScheduleCreateTransaction,
3+
Timestamp,
4+
AccountId,
5+
ScheduleSignTransaction,
6+
ScheduleId,
7+
TransactionReceiptQuery,
8+
Status,
9+
} from "@hashgraph/sdk";
10+
11+
import {
12+
ScheduleCreateParams,
13+
ScheduledTransaction,
14+
ScheduleSignParams,
15+
} from "../params/schedule";
16+
import { ScheduleResponse } from "../response/schedule";
17+
18+
import { DEFAULT_GRPC_DEADLINE } from "../utils/constants/config";
19+
import { applyCommonTransactionParams } from "../params/common-tx-params";
20+
import { sdk } from "../sdk_data";
21+
import { getKeyFromString } from "../utils/key";
22+
import Long from "long";
23+
24+
// Import parameter types for scheduled transactions
25+
import { TransferCryptoParams } from "../params/transfer";
26+
import {
27+
AccountAllowanceApproveParams,
28+
CreateAccountParams,
29+
} from "../params/account";
30+
import { MintTokenParams, BurnTokenParams } from "../params/token";
31+
import { TopicSubmitMessageParams, TopicCreateParams } from "../params/topic";
32+
33+
// Import build functions from other method files
34+
import {
35+
buildTransferCrypto,
36+
buildApproveAllowance,
37+
buildCreateAccount,
38+
} from "./account";
39+
import { buildMintToken, buildBurnToken } from "./token";
40+
import { buildSubmitTopicMessage, buildCreateTopic } from "./topic";
41+
42+
export const createSchedule = async ({
43+
scheduledTransaction,
44+
memo,
45+
adminKey,
46+
payerAccountId,
47+
expirationTime,
48+
waitForExpiry,
49+
commonTransactionParams,
50+
}: ScheduleCreateParams): Promise<ScheduleResponse> => {
51+
const transaction = new ScheduleCreateTransaction().setGrpcDeadline(
52+
DEFAULT_GRPC_DEADLINE,
53+
);
54+
55+
if (scheduledTransaction != null) {
56+
const scheduledTx = buildScheduledTransaction(scheduledTransaction);
57+
transaction.setScheduledTransaction(scheduledTx);
58+
}
59+
60+
if (memo != null) {
61+
transaction.setScheduleMemo(memo);
62+
}
63+
64+
if (adminKey != null) {
65+
transaction.setAdminKey(getKeyFromString(adminKey));
66+
}
67+
68+
if (payerAccountId != null) {
69+
transaction.setPayerAccountId(AccountId.fromString(payerAccountId));
70+
}
71+
72+
if (expirationTime != null) {
73+
transaction.setExpirationTime(
74+
new Timestamp(Long.fromString(expirationTime), 0),
75+
);
76+
}
77+
78+
if (waitForExpiry != null) {
79+
transaction.setWaitForExpiry(waitForExpiry);
80+
}
81+
82+
if (commonTransactionParams != null) {
83+
applyCommonTransactionParams(
84+
commonTransactionParams,
85+
transaction,
86+
sdk.getClient(),
87+
);
88+
}
89+
90+
const txResponse = await transaction.execute(sdk.getClient());
91+
const receipt = await new TransactionReceiptQuery()
92+
.setTransactionId(txResponse.transactionId)
93+
.setValidateStatus(true)
94+
.execute(sdk.getClient());
95+
96+
let scheduleId: string | undefined;
97+
if (receipt.status === Status.Success) {
98+
scheduleId = receipt.scheduleId?.toString();
99+
}
100+
101+
return {
102+
scheduleId: scheduleId,
103+
transactionId: receipt.scheduledTransactionId?.toString(),
104+
status: receipt.status.toString(),
105+
};
106+
};
107+
108+
// buildScheduledTransaction creates the appropriate transaction based on method name
109+
const buildScheduledTransaction = (scheduledTx: ScheduledTransaction): any => {
110+
switch (scheduledTx.method) {
111+
case "transferCrypto":
112+
const transferParams = scheduledTx.params as TransferCryptoParams;
113+
return buildTransferCrypto(transferParams);
114+
115+
case "approveAllowance":
116+
const allowanceParams =
117+
scheduledTx.params as AccountAllowanceApproveParams;
118+
return buildApproveAllowance(allowanceParams);
119+
120+
case "mintToken":
121+
const mintParams = scheduledTx.params as MintTokenParams;
122+
return buildMintToken(mintParams);
123+
124+
case "burnToken":
125+
const burnParams = scheduledTx.params as BurnTokenParams;
126+
return buildBurnToken(burnParams);
127+
128+
case "submitMessage":
129+
const submitParams = scheduledTx.params as TopicSubmitMessageParams;
130+
return buildSubmitTopicMessage(submitParams);
131+
132+
case "createTopic":
133+
const topicParams = scheduledTx.params as TopicCreateParams;
134+
return buildCreateTopic(topicParams);
135+
136+
case "createAccount":
137+
const accountParams = scheduledTx.params as CreateAccountParams;
138+
return buildCreateAccount(accountParams);
139+
140+
default:
141+
throw new Error(
142+
`Unsupported scheduled transaction method: ${scheduledTx.method} (only transferCrypto, approveAllowance, mintToken, burnToken, submitMessage, createTopic, and createAccount are supported)`,
143+
);
144+
}
145+
};
146+
147+
export const signSchedule = async ({
148+
scheduleId,
149+
commonTransactionParams,
150+
}: ScheduleSignParams): Promise<ScheduleResponse> => {
151+
const transaction = new ScheduleSignTransaction().setGrpcDeadline(
152+
DEFAULT_GRPC_DEADLINE,
153+
);
154+
155+
if (scheduleId != null) {
156+
const scheduleID = ScheduleId.fromString(scheduleId);
157+
transaction.setScheduleId(scheduleID);
158+
}
159+
160+
if (commonTransactionParams != null) {
161+
applyCommonTransactionParams(
162+
commonTransactionParams,
163+
transaction,
164+
sdk.getClient(),
165+
);
166+
}
167+
168+
const txResponse = await transaction.execute(sdk.getClient());
169+
const receipt = await new TransactionReceiptQuery()
170+
.setTransactionId(txResponse.transactionId)
171+
.setValidateStatus(true)
172+
.execute(sdk.getClient());
173+
174+
return {
175+
status: receipt.status.toString(),
176+
};
177+
};

0 commit comments

Comments
 (0)