@zebec-network/solana-payroll-sdk 1.0.0-dev.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/services.js CHANGED
@@ -2,32 +2,32 @@ import { AnchorProvider, translateAddress, utils, } from "@coral-xyz/anchor";
2
2
  import { fetchMetadata, MPL_TOKEN_METADATA_PROGRAM_ID, } from "@metaplex-foundation/mpl-token-metadata";
3
3
  import { createUmi } from "@metaplex-foundation/umi-bundle-defaults";
4
4
  import { fromWeb3JsPublicKey, toWeb3JsPublicKey, } from "@metaplex-foundation/umi-web3js-adapters";
5
- import { createTransferInstruction } from "@solana/spl-token";
6
5
  import { Keypair, PublicKey, } from "@solana/web3.js";
7
6
  import { bpsToPercent, percentToBps } from "@zebec-network/core-utils";
8
- import { createAssociatedTokenAccountInstruction, getAssociatedTokenAddressSync, getMintDecimals, TEN_BIGNUM, TransactionPayload, UNITS_PER_USDC, USDC_DECIMALS, } from "@zebec-network/solana-common";
9
- import BigNumber from "bignumber.js";
7
+ import { createAssociatedTokenAccountInstruction, getAssociatedTokenAddressSync, getMintDecimals, TEN_BIGNUM, TransactionPayload, UNITS_PER_USDC, } from "@zebec-network/solana-common";
8
+ import { BigNumber } from "bignumber.js";
10
9
  import { BN } from "bn.js";
11
10
  import { PAYROLL_NAME_BUFFER_SIZE } from "./constants.js";
12
- import { createCancelStreamInstruction, createChangeRecipientInstruction, createCreateStreamInstruction, createInitializeConfigInstruction, createPauseResumeStreamInstruction, createSetTopupDelegateInstruction, createTopupStreamInstruction, createUpdateConfigInstruction, createWhitelistTokensInstruction, createWithdrawStreamInstruction, } from "./instructions.js";
13
- import { deriveStreamConfigPda, deriveStreamVaultPda } from "./pda.js";
14
- import { getFeeInfoForStream, getNetworkFromConnection } from "./utils.js";
15
- export async function getPayrollConfig(program, configName) {
16
- const [streamConfigPda] = deriveStreamConfigPda(configName, program.programId);
17
- const streamConfig = await program.account.streamConfig.fetchNullable(streamConfigPda);
18
- if (!streamConfig) {
19
- throw new Error(`Stream config not found for name: ${configName}`);
11
+ import { createCancelPayrollInstruction, createChangeRecipientInstruction, createCreatePayrollInstruction, createPauseResumePayrollInstruction, createSetTopupDelegateInstruction, createTopupPayrollInstruction, createTransferFeesInstruction, createWithdrawPayrollInstruction, } from "./instructions.js";
12
+ import { derivePayrollConfigPda, derivePayrollVaultPda } from "./pda.js";
13
+ import { getFeeInfoForPayroll } from "./utils.js";
14
+ export async function getPayrollConfig(configProgram, configName) {
15
+ const [payrollConfigPda] = derivePayrollConfigPda(configName, configProgram.programId);
16
+ const payrollConfig = await configProgram.account.payrollConfig.fetchNullable(payrollConfigPda);
17
+ if (!payrollConfig) {
18
+ throw new Error(`Payroll config not found for name: ${configName}`);
20
19
  }
21
20
  return {
22
21
  configName,
23
- address: streamConfigPda,
24
- admin: streamConfig.admin,
25
- withdrawerAccount: streamConfig.withdrawAccount,
26
- whitelistedTokens: streamConfig.whitelistedTokens,
27
- platformFee: Number(bpsToPercent(streamConfig.platformFee.toNumber())),
28
- baseFee: Number(bpsToPercent(streamConfig.baseFee.toNumber())),
29
- frequencies: streamConfig.frequencies.map((f) => f.toNumber()),
30
- feeTiers: streamConfig.feeTiers.tiers.map((t) => ({
22
+ address: payrollConfigPda,
23
+ admin: payrollConfig.admin,
24
+ feeToken: payrollConfig.feeToken,
25
+ withdrawerAccount: payrollConfig.withdrawAccount,
26
+ whitelistedTokens: payrollConfig.whitelistedTokens,
27
+ platformFee: Number(bpsToPercent(payrollConfig.platformFee.toNumber())),
28
+ baseFee: Number(bpsToPercent(payrollConfig.baseFee.toNumber())),
29
+ frequencies: payrollConfig.frequencies.map((f) => f.toNumber()),
30
+ feeTiers: payrollConfig.feeTiers.tiers.map((t) => ({
31
31
  minThreshold: BigNumber(t.minAmount.toString())
32
32
  .div(UNITS_PER_USDC)
33
33
  .toFixed(),
@@ -36,18 +36,21 @@ export async function getPayrollConfig(program, configName) {
36
36
  .toFixed(),
37
37
  feeRateInPercent: Number(bpsToPercent(t.fee.toNumber())),
38
38
  })),
39
- feeVault: streamConfig.feeVault,
39
+ feeVault: payrollConfig.feeVault,
40
40
  };
41
41
  }
42
- export async function getWhitelistedTokens(program, configName, commitment) {
43
- const [config] = deriveStreamConfigPda(configName, program.programId);
44
- const configInfo = await program.account.streamConfig.fetch(config, commitment ?? program.provider.connection.commitment);
45
- const whitelistedTokens = configInfo.whitelistedTokens;
46
- const umi = createUmi(program.provider.connection.rpcEndpoint, commitment);
42
+ export async function getWhitelistedTokens(configProgram, configName, commitment) {
43
+ const [config] = derivePayrollConfigPda(configName, configProgram.programId);
44
+ const configAccount = await configProgram.account.payrollConfig.fetchNullable(config, commitment ?? configProgram.provider.connection.commitment);
45
+ if (!configAccount) {
46
+ throw new Error(`Payroll config not found for name: ${configName}`);
47
+ }
48
+ const whitelistedTokens = configAccount.whitelistedTokens;
49
+ const umi = createUmi(configProgram.provider.connection.rpcEndpoint, commitment);
47
50
  return Promise.all(whitelistedTokens.map(async (mint) => {
48
51
  const mplProgramId = toWeb3JsPublicKey(MPL_TOKEN_METADATA_PROGRAM_ID);
49
52
  const [metadata] = PublicKey.findProgramAddressSync([Buffer.from("metadata"), mplProgramId.toBytes(), mint.toBytes()], mplProgramId);
50
- const mintInfo = await program.provider.connection.getParsedAccountInfo(mint, commitment);
53
+ const mintInfo = await configProgram.provider.connection.getParsedAccountInfo(mint, commitment);
51
54
  if (!mintInfo.value) {
52
55
  throw new Error(`Failed to fetch mint account: ${mint.toString()}`);
53
56
  }
@@ -104,29 +107,38 @@ export async function getWhitelistedTokens(program, configName, commitment) {
104
107
  }
105
108
  }));
106
109
  }
107
- export async function getStreamMetadataInfo(program, streamMetadata, commitment) {
108
- const metadataInfo = await program.account.paymentStream.fetch(translateAddress(streamMetadata), commitment ?? program.provider.connection.commitment);
109
- const streamToken = metadataInfo.financials.streamToken;
110
- const streamTokenDecimals = await getMintDecimals(program.provider.connection, streamToken);
111
- const unitsPerStreamToken = TEN_BIGNUM.pow(streamTokenDecimals);
110
+ export async function getPayrollMetadataInfo(program, payrollMetadata, commitment) {
111
+ const metadataInfo = await program.account.paymentStream.fetch(translateAddress(payrollMetadata), commitment ?? program.provider.connection.commitment);
112
+ const payrollToken = metadataInfo.financials.streamToken;
113
+ const payrollTokenDecimals = await getMintDecimals(program.provider.connection, payrollToken);
114
+ const unitsPerPayrollToken = BigNumber(10).pow(payrollTokenDecimals);
112
115
  const depositedAmount = BigNumber(metadataInfo.financials.depositedAmount.toString())
113
- .div(unitsPerStreamToken)
116
+ .div(unitsPerPayrollToken)
114
117
  .toFixed();
115
118
  const withdrawnAmount = BigNumber(metadataInfo.financials.withdrawnAmount.toString())
116
- .div(unitsPerStreamToken)
119
+ .div(unitsPerPayrollToken)
120
+ .toFixed();
121
+ const initialBufferAmount = BigNumber(metadataInfo.topupState.initialBufferAmount.toString())
122
+ .div(unitsPerPayrollToken)
117
123
  .toFixed();
118
124
  const cliffPercentage = Number(bpsToPercent(metadataInfo.financials.cliffPercentage.toNumber()));
125
+ const fullAmount = BigNumber(metadataInfo.financials.fullAmount.toString())
126
+ .div(unitsPerPayrollToken)
127
+ .toFixed();
119
128
  return {
120
- address: translateAddress(streamMetadata),
129
+ address: translateAddress(payrollMetadata),
121
130
  parties: {
122
131
  sender: metadataInfo.parties.sender,
132
+ senderId: Buffer.from(metadataInfo.senderId),
123
133
  receiver: metadataInfo.parties.receiver,
134
+ receiverId: Buffer.from(metadataInfo.receiverId),
124
135
  },
125
136
  financials: {
126
- streamToken,
137
+ payrollToken,
127
138
  cliffPercentage,
128
139
  depositedAmount,
129
140
  withdrawnAmount,
141
+ fullAmount,
130
142
  },
131
143
  schedule: {
132
144
  startTime: metadataInfo.schedule.startTime.toNumber(),
@@ -140,7 +152,7 @@ export async function getStreamMetadataInfo(program, streamMetadata, commitment)
140
152
  },
141
153
  topupState: {
142
154
  coveredUntill: metadataInfo.topupState.coveredUntil.toNumber(),
143
- initialBufferDuration: metadataInfo.topupState.initialBufferDuration.toNumber(),
155
+ initialBufferAmount,
144
156
  topupCount: metadataInfo.topupState.topupCount.toNumber(),
145
157
  },
146
158
  permissions: {
@@ -153,7 +165,7 @@ export async function getStreamMetadataInfo(program, streamMetadata, commitment)
153
165
  isPausable: Boolean(metadataInfo.permissions.isPausable),
154
166
  rateUpdatable: Boolean(metadataInfo.permissions.rateUpdatable),
155
167
  },
156
- streamName: utils.bytes.utf8.decode(Uint8Array.from(metadataInfo.streamName).filter((byte) => byte !== 0)), // Remove padding zeros
168
+ payrollName: utils.bytes.utf8.decode(Uint8Array.from(metadataInfo.streamName).filter((byte) => byte !== 0)), // Remove padding zeros
157
169
  };
158
170
  }
159
171
  async function createPayload(program, payerKey, instructions, signers, addressLookupTableAccounts) {
@@ -173,144 +185,78 @@ async function createPayload(program, payerKey, instructions, signers, addressLo
173
185
  addressLookupTableAccounts: addressLookupTableAccounts ?? [],
174
186
  }, signTransaction);
175
187
  }
176
- export async function initializePayrollConfig(program, params) {
177
- const admin = params.admin
178
- ? translateAddress(params.admin)
179
- : program.provider.publicKey;
180
- if (!admin) {
181
- throw new Error("Either provide admin or create provider with public key");
182
- }
183
- const [streamConfig] = deriveStreamConfigPda(params.config.streamConfigName, program.programId);
184
- const baseFee = new BN(percentToBps(params.config.baseFeePercent));
185
- const frequencies = params.config.frequencies.map((frequency) => new BN(frequency));
186
- const platformFee = new BN(percentToBps(params.config.platformFeePercent));
187
- const withdrawAccount = translateAddress(params.config.withdrawAccount);
188
- const feeVault = translateAddress(params.config.feeVault);
189
- const feeTiers = params.config.feeTiers.map((tier) => {
190
- return {
191
- minAmount: new BN(BigNumber(tier.minThreshold)
192
- .times(TEN_BIGNUM.pow(USDC_DECIMALS))
193
- .toFixed(0)),
194
- maxAmount: new BN(BigNumber(tier.maxThreshold)
195
- .times(TEN_BIGNUM.pow(USDC_DECIMALS))
196
- .toFixed(0)),
197
- fee: new BN(percentToBps(tier.feeRateInPercent)),
198
- };
199
- });
200
- const ix = await createInitializeConfigInstruction(program, { admin, streamConfig }, {
201
- baseFee,
202
- frequencies,
203
- platformFee,
204
- withdrawAccount,
205
- feeTiers,
206
- configName: params.config.streamConfigName,
207
- feeVault,
208
- });
209
- return createPayload(program, admin, [ix]);
210
- }
211
- export async function updatePayrollConfig(program, params) {
212
- const admin = params.admin
213
- ? translateAddress(params.admin)
214
- : program.provider.publicKey;
215
- if (!admin) {
216
- throw new Error("Either provide admin or create provider with public key");
217
- }
218
- const [streamConfig] = deriveStreamConfigPda(params.config.streamConfigName, program.programId);
219
- const baseFee = new BN(percentToBps(params.config.baseFeePercent));
220
- const frequencies = params.config.frequencies.map((frequency) => new BN(frequency));
221
- const platformFee = new BN(percentToBps(params.config.platformFeePercent));
222
- const withdrawAccount = translateAddress(params.config.withdrawAccount);
223
- const feeVault = translateAddress(params.config.feeVault);
224
- const feeTiers = params.config.feeTiers.map((tier) => {
225
- return {
226
- minAmount: new BN(BigNumber(tier.minThreshold)
227
- .times(TEN_BIGNUM.pow(USDC_DECIMALS))
228
- .toFixed(0)),
229
- maxAmount: new BN(BigNumber(tier.maxThreshold)
230
- .times(TEN_BIGNUM.pow(USDC_DECIMALS))
231
- .toFixed(0)),
232
- fee: new BN(percentToBps(tier.feeRateInPercent)),
233
- };
234
- });
235
- const ix = await createUpdateConfigInstruction(program, { admin, streamConfig }, {
236
- baseFee,
237
- frequencies,
238
- platformFee,
239
- withdrawAccount,
240
- feeTiers,
241
- configName: params.config.streamConfigName,
242
- feeVault,
243
- });
244
- return createPayload(program, admin, [ix]);
245
- }
246
- export async function whiteListTokens(program, params) {
247
- const admin = translateAddress(params.admin);
248
- const [streamConfig] = deriveStreamConfigPda(params.streamConfigName, program.programId);
249
- const tokens = params.tokens.map((token) => translateAddress(token));
250
- const ix = await createWhitelistTokensInstruction(program, {
251
- admin,
252
- streamConfig,
253
- }, { tokens });
254
- return createPayload(program, admin, [ix]);
255
- }
256
- export async function createStream(program, params) {
188
+ export async function createPayroll(payrollProgram, configProgram, params, payrollFeeBaseUrl) {
257
189
  const receiver = translateAddress(params.receiver);
258
190
  const sender = translateAddress(params.sender);
259
191
  const feePayer = params.feePayer ? translateAddress(params.feePayer) : sender;
260
- const streamToken = translateAddress(params.streamToken);
261
- const [streamConfig] = deriveStreamConfigPda(params.streamConfigName, program.programId);
262
- const streamConfigAccount = await program.account.streamConfig.fetch(streamConfig);
263
- const withdrawer = streamConfigAccount.withdrawAccount;
264
- const autoWithdrawFrequencies = new Set(Array.from(streamConfigAccount.frequencies.map((f) => f.toNumber())));
192
+ const payrollToken = translateAddress(params.payrollToken);
193
+ const [payrollConfig] = derivePayrollConfigPda(params.payrollConfigName, configProgram.programId);
194
+ const payrollConfigAccount = await configProgram.account.payrollConfig.fetchNullable(payrollConfig);
195
+ if (!payrollConfigAccount) {
196
+ throw new Error(`Payroll config not found for name: ${params.payrollConfigName}`);
197
+ }
198
+ const withdrawer = payrollConfigAccount.withdrawAccount;
199
+ const autoWithdrawFrequencies = new Set(Array.from(payrollConfigAccount.frequencies.map((f) => f.toNumber())));
265
200
  if (params.automaticWithdrawal &&
266
201
  !autoWithdrawFrequencies.has(params.autoWithdrawFrequency)) {
267
- throw new Error("Invalid stream frequency");
202
+ throw new Error("Invalid payroll frequency");
268
203
  }
269
- const senderAta = getAssociatedTokenAddressSync(streamToken, sender, true);
270
- const receiverAta = getAssociatedTokenAddressSync(streamToken, receiver, true);
271
- const streamMetadataKeypair = params.streamMetadataKeypair ?? Keypair.generate();
272
- const [streamVault] = deriveStreamVaultPda(streamMetadataKeypair.publicKey, program.programId);
273
- const streamVaultAta = getAssociatedTokenAddressSync(streamToken, streamVault, true);
274
- const streamTokenDecimals = await getMintDecimals(program.provider.connection, streamToken);
204
+ const senderAta = getAssociatedTokenAddressSync(payrollToken, sender, true);
205
+ const receiverAta = getAssociatedTokenAddressSync(payrollToken, receiver, true);
206
+ const payrollMetadataKeypair = params.payrollMetadataKeypair ?? Keypair.generate();
207
+ const [payrollVault] = derivePayrollVaultPda(payrollMetadataKeypair.publicKey, payrollProgram.programId);
208
+ const payrollVaultAta = getAssociatedTokenAddressSync(payrollToken, payrollVault, true);
209
+ const payrollTokenDecimals = await getMintDecimals(payrollProgram.provider.connection, payrollToken);
275
210
  const amount = BigNumber(params.amount)
276
- .times(TEN_BIGNUM.pow(streamTokenDecimals))
211
+ .times(TEN_BIGNUM.pow(payrollTokenDecimals))
212
+ .toFixed(0);
213
+ const initialBufferAmount = BigNumber(params.initialBufferAmount)
214
+ .times(TEN_BIGNUM.pow(payrollTokenDecimals))
277
215
  .toFixed(0);
278
216
  const cliffPercentage = new BN(percentToBps(params.cliffPercentage));
279
- const streamName = new Uint8Array(PAYROLL_NAME_BUFFER_SIZE);
280
- streamName.set(utils.bytes.utf8.encode(params.streamName));
281
- const configAccount = await program.account.streamConfig.fetch(streamConfig);
282
- const network = getNetworkFromConnection(program.provider.connection);
283
- const feeInfo = await getFeeInfoForStream(streamToken, amount, streamTokenDecimals, network);
284
- const feeToken = translateAddress(feeInfo.feeToken.mintAddress);
217
+ const payrollName = new Uint8Array(PAYROLL_NAME_BUFFER_SIZE);
218
+ payrollName.set(utils.bytes.utf8.encode(params.payrollName));
219
+ const feeInfo = await getFeeInfoForPayroll(payrollFeeBaseUrl, payrollToken, amount);
220
+ const feeTokenDecimals = await getMintDecimals(payrollProgram.provider.connection, payrollConfigAccount.feeToken);
285
221
  const parsedFeeAmount = feeInfo.feeAmountRaw;
286
- const feeVault = configAccount.feeVault;
287
- const feeVaultAta = getAssociatedTokenAddressSync(feeToken, feeVault, true);
288
- const senderFeeTokenAta = getAssociatedTokenAddressSync(feeToken, sender, true);
289
- const feeVaultAtaInfo = await program.provider.connection.getAccountInfo(feeVaultAta);
222
+ const feeVault = payrollConfigAccount.feeVault;
223
+ const feeVaultAta = getAssociatedTokenAddressSync(payrollConfigAccount.feeToken, feeVault, true);
224
+ const senderFeeTokenAta = getAssociatedTokenAddressSync(payrollConfigAccount.feeToken, sender, true);
225
+ const feeVaultAtaInfo = await payrollProgram.provider.connection.getAccountInfo(feeVaultAta);
290
226
  const ixs = [];
291
227
  // add instruction to create fee vault ATA if it does not exist
292
228
  if (!feeVaultAtaInfo) {
293
- const createFeeVaultAtaIx = createAssociatedTokenAccountInstruction(feePayer, feeVaultAta, feeVault, feeToken);
229
+ const createFeeVaultAtaIx = createAssociatedTokenAccountInstruction(feePayer, feeVaultAta, feeVault, payrollConfigAccount.feeToken);
294
230
  ixs.push(createFeeVaultAtaIx);
295
231
  }
296
232
  // add instruction to transfer fee to fee vault
297
- const transferFeeToVaultIx = createTransferInstruction(senderFeeTokenAta, feeVaultAta, sender, BigInt(parsedFeeAmount));
298
- ixs.push(transferFeeToVaultIx);
299
- const createStreamIx = await createCreateStreamInstruction(program, {
300
- streamConfig,
233
+ const transferFeeIx = await createTransferFeesInstruction(payrollProgram, {
234
+ feeVault,
235
+ feeVaultTokenAccount: feeVaultAta,
236
+ payrollConfig,
237
+ sender,
238
+ senderTokenAccount: senderFeeTokenAta,
239
+ tokenMint: payrollConfigAccount.feeToken,
240
+ }, {
241
+ decimals: feeTokenDecimals,
242
+ feeAmount: new BN(parsedFeeAmount),
243
+ });
244
+ ixs.push(transferFeeIx);
245
+ const createpayrollIx = await createCreatePayrollInstruction(payrollProgram, {
246
+ payrollConfig,
301
247
  feePayer,
302
248
  receiver,
303
249
  senderAta,
304
- streamToken,
250
+ payrollToken,
305
251
  sender,
306
252
  receiverAta,
307
- streamMetadata: streamMetadataKeypair.publicKey,
308
- streamVault,
309
- streamVaultAta,
253
+ payrollMetadata: payrollMetadataKeypair.publicKey,
254
+ payrollVault,
255
+ payrollVaultAta,
310
256
  withdrawAccount: withdrawer,
311
257
  }, {
312
258
  autoTopupDelegate: Number(params.delegateAutoTopup),
313
- initialBufferDuration: new BN(params.initialBufferDuration),
259
+ initialBufferAmount: new BN(initialBufferAmount),
314
260
  amount: new BN(amount),
315
261
  automaticWithdrawal: Number(params.automaticWithdrawal),
316
262
  cancelableByRecipient: Number(params.cancelableByRecipient),
@@ -323,62 +269,62 @@ export async function createStream(program, params) {
323
269
  startNow: Number(params.startNow),
324
270
  startTime: new BN(params.startTime),
325
271
  autoWithdrawFrequency: new BN(params.autoWithdrawFrequency),
326
- streamName: Array.from(streamName),
272
+ payrollName: Array.from(payrollName),
327
273
  transferableByRecipient: Number(params.transferableByRecipient),
328
274
  transferableBySender: Number(params.transferableBySender),
329
275
  receiverId: Array.from(params.receiverId),
330
276
  senderId: Array.from(params.senderId),
331
277
  });
332
- ixs.push(createStreamIx);
333
- return createPayload(program, feePayer, ixs, [streamMetadataKeypair]);
278
+ ixs.push(createpayrollIx);
279
+ return createPayload(payrollProgram, feePayer, ixs, [payrollMetadataKeypair]);
334
280
  }
335
- export async function cancelStream(program, params) {
281
+ export async function cancelPayroll(program, params) {
336
282
  const user = translateAddress(params.user);
337
- const streamMetadata = translateAddress(params.streamMetadata);
338
- const streamMetadataAccount = await program.account.paymentStream.fetch(streamMetadata);
339
- const streamToken = streamMetadataAccount.financials.streamToken;
340
- const streamer = streamMetadataAccount.parties.sender;
341
- const receiver = streamMetadataAccount.parties.receiver;
283
+ const payrollMetadata = translateAddress(params.payrollMetadata);
284
+ const payrollMetadataAccount = await program.account.paymentStream.fetch(payrollMetadata);
285
+ const payrollToken = payrollMetadataAccount.financials.streamToken;
286
+ const payroller = payrollMetadataAccount.parties.sender;
287
+ const receiver = payrollMetadataAccount.parties.receiver;
342
288
  let otherParty;
343
- if (user.equals(streamer)) {
289
+ if (user.equals(payroller)) {
344
290
  otherParty = receiver;
345
291
  }
346
292
  else if (user.equals(receiver)) {
347
- otherParty = streamer;
293
+ otherParty = payroller;
348
294
  }
349
295
  else {
350
- throw new Error("User must be either streamer or receiver");
296
+ throw new Error("User must be either payroller or receiver");
351
297
  }
352
298
  const feePayer = params.feePayer ? translateAddress(params.feePayer) : user;
353
- const userAta = getAssociatedTokenAddressSync(streamToken, user, true);
354
- const otherPartyAta = getAssociatedTokenAddressSync(streamToken, otherParty, true);
355
- const [streamVault] = deriveStreamVaultPda(streamMetadata, program.programId);
356
- const streamVaultAta = getAssociatedTokenAddressSync(streamToken, streamVault, true);
357
- const ix = await createCancelStreamInstruction(program, {
299
+ const userAta = getAssociatedTokenAddressSync(payrollToken, user, true);
300
+ const otherPartyAta = getAssociatedTokenAddressSync(payrollToken, otherParty, true);
301
+ const [payrollVault] = derivePayrollVaultPda(payrollMetadata, program.programId);
302
+ const payrollVaultAta = getAssociatedTokenAddressSync(payrollToken, payrollVault, true);
303
+ const ix = await createCancelPayrollInstruction(program, {
358
304
  feePayer,
359
305
  otherParty,
360
306
  otherPartyAta,
361
307
  signer: user,
362
308
  signerAta: userAta,
363
- streamMetadata,
364
- streamToken,
365
- streamVault,
366
- streamVaultAta,
309
+ payrollMetadata,
310
+ payrollToken,
311
+ payrollVault,
312
+ payrollVaultAta,
367
313
  });
368
314
  return createPayload(program, feePayer, [ix]);
369
315
  }
370
- export async function pauseResumeStream(program, params) {
371
- const streamMetadata = translateAddress(params.streamMetadata);
372
- const streamMetadataAccount = await program.account.paymentStream.fetch(streamMetadata);
373
- const user = streamMetadataAccount.parties.sender;
374
- const ix = await createPauseResumeStreamInstruction(program, {
375
- streamMetadata,
316
+ export async function pauseResumePayroll(program, params) {
317
+ const payrollMetadata = translateAddress(params.payrollMetadata);
318
+ const payrollMetadataAccount = await program.account.paymentStream.fetch(payrollMetadata);
319
+ const user = payrollMetadataAccount.parties.sender;
320
+ const ix = await createPauseResumePayrollInstruction(program, {
321
+ payrollMetadata,
376
322
  user,
377
323
  });
378
324
  return createPayload(program, user, [ix]);
379
325
  }
380
- export async function withdrawStream(program, params) {
381
- const [streamConfig] = deriveStreamConfigPda(params.streamConfigName, program.programId);
326
+ export async function withdrawPayroll(payrollProgram, configProgram, params) {
327
+ const [payrollConfig] = derivePayrollConfigPda(params.payrollConfigName, configProgram.programId);
382
328
  const receiver = translateAddress(params.receiver);
383
329
  const withdrawer = params.withdrawer
384
330
  ? translateAddress(params.withdrawer)
@@ -388,85 +334,85 @@ export async function withdrawStream(program, params) {
388
334
  : params.withdrawer
389
335
  ? withdrawer
390
336
  : receiver;
391
- const streamMetadata = translateAddress(params.streamMetadata);
392
- const streamMetadataAccount = await program.account.paymentStream.fetch(streamMetadata);
393
- const streamToken = streamMetadataAccount.financials.streamToken;
394
- const receiverAta = getAssociatedTokenAddressSync(streamToken, receiver, true);
395
- const [streamVault] = deriveStreamVaultPda(streamMetadata, program.programId);
396
- const streamVaultAta = getAssociatedTokenAddressSync(streamToken, streamVault, true);
397
- const ix = await createWithdrawStreamInstruction(program, {
337
+ const payrollMetadata = translateAddress(params.payrollMetadata);
338
+ const payrollMetadataAccount = await payrollProgram.account.paymentStream.fetch(payrollMetadata);
339
+ const payrollToken = payrollMetadataAccount.financials.streamToken;
340
+ const receiverAta = getAssociatedTokenAddressSync(payrollToken, receiver, true);
341
+ const [payrollVault] = derivePayrollVaultPda(payrollMetadata, payrollProgram.programId);
342
+ const payrollVaultAta = getAssociatedTokenAddressSync(payrollToken, payrollVault, true);
343
+ const ix = await createWithdrawPayrollInstruction(payrollProgram, {
398
344
  receiver,
399
345
  receiverAta,
400
- streamConfig,
401
- streamMetadata,
402
- streamToken,
403
- streamVault,
404
- streamVaultAta,
346
+ payrollConfig,
347
+ payrollMetadata,
348
+ payrollToken,
349
+ payrollVault,
350
+ payrollVaultAta,
405
351
  withdrawer,
406
352
  feePayer,
407
353
  });
408
- return createPayload(program, withdrawer, [ix]);
354
+ return createPayload(payrollProgram, withdrawer, [ix]);
409
355
  }
410
- export async function changeStreamReceiver(program, params) {
411
- const streamMetadata = translateAddress(params.streamMetadata);
356
+ export async function changePayrollReceiver(program, params) {
357
+ const payrollMetadata = translateAddress(params.payrollMetadata);
412
358
  const newRecipient = translateAddress(params.newRecipient);
413
359
  const signer = translateAddress(params.signer);
414
360
  const ix = await createChangeRecipientInstruction(program, {
415
- stream: streamMetadata,
361
+ payrollMetadata: payrollMetadata,
416
362
  newRecipient,
417
363
  signer,
418
364
  });
419
365
  return createPayload(program, signer, [ix]);
420
366
  }
421
- export async function setTopupDelegate(program, params) {
367
+ export async function setTopupDelegate(payrollProgram, configProgram, params) {
422
368
  const sender = translateAddress(params.sender);
423
- const streamMetadata = translateAddress(params.streamMetadata);
424
- const streamMetadataAccount = await program.account.paymentStream.fetch(streamMetadata);
425
- const streamToken = streamMetadataAccount.financials.streamToken;
426
- const senderAta = getAssociatedTokenAddressSync(streamToken, sender, true);
427
- const [streamVault] = deriveStreamVaultPda(streamMetadata, program.programId);
428
- const [streamConfig] = deriveStreamConfigPda(params.streamConfigName, program.programId);
429
- const streamTokenDecimals = await getMintDecimals(program.provider.connection, streamToken);
369
+ const payrollMetadata = translateAddress(params.payrollMetadata);
370
+ const payrollMetadataAccount = await payrollProgram.account.paymentStream.fetch(payrollMetadata);
371
+ const payrollToken = payrollMetadataAccount.financials.streamToken;
372
+ const senderAta = getAssociatedTokenAddressSync(payrollToken, sender, true);
373
+ const [payrollVault] = derivePayrollVaultPda(payrollMetadata, payrollProgram.programId);
374
+ const [payrollConfig] = derivePayrollConfigPda(params.payrollConfigName, configProgram.programId);
375
+ const payrollTokenDecimals = await getMintDecimals(payrollProgram.provider.connection, payrollToken);
430
376
  const amount = new BN(BigNumber(params.amount)
431
- .multipliedBy(BigNumber(10).pow(streamTokenDecimals))
377
+ .multipliedBy(BigNumber(10).pow(payrollTokenDecimals))
432
378
  .toFixed(0));
433
- const ix = await createSetTopupDelegateInstruction(program, {
379
+ const ix = await createSetTopupDelegateInstruction(payrollProgram, {
434
380
  sender,
435
381
  senderAta,
436
- streamConfig,
437
- streamMetadata,
438
- streamToken,
439
- streamVault,
382
+ payrollConfig,
383
+ payrollMetadata,
384
+ payrollToken,
385
+ payrollVault,
440
386
  }, {
441
387
  amount,
442
388
  });
443
- return createPayload(program, sender, [ix]);
389
+ return createPayload(payrollProgram, sender, [ix]);
444
390
  }
445
- export async function topupStream(program, params) {
391
+ export async function topupPayroll(payrollProgram, configProgram, params) {
446
392
  const sender = translateAddress(params.sender);
447
- const streamMetadata = translateAddress(params.streamMetadata);
393
+ const payrollMetadata = translateAddress(params.payrollMetadata);
448
394
  const caller = params.caller ? translateAddress(params.caller) : sender;
449
- const streamMetadataAccount = await program.account.paymentStream.fetch(streamMetadata);
450
- const streamToken = streamMetadataAccount.financials.streamToken;
451
- const senderAta = getAssociatedTokenAddressSync(streamToken, sender, true);
452
- const [streamVault] = deriveStreamVaultPda(streamMetadata, program.programId);
453
- const [streamConfig] = deriveStreamConfigPda(params.streamConfigName, program.programId);
454
- const streamTokenDecimals = await getMintDecimals(program.provider.connection, streamToken);
395
+ const payrollMetadataAccount = await payrollProgram.account.paymentStream.fetch(payrollMetadata);
396
+ const payrollToken = payrollMetadataAccount.financials.streamToken;
397
+ const senderAta = getAssociatedTokenAddressSync(payrollToken, sender, true);
398
+ const [payrollVault] = derivePayrollVaultPda(payrollMetadata, payrollProgram.programId);
399
+ const [payrollConfig] = derivePayrollConfigPda(params.payrollConfigName, configProgram.programId);
400
+ const payrollTokenDecimals = await getMintDecimals(payrollProgram.provider.connection, payrollToken);
455
401
  const amount = new BN(BigNumber(params.extra)
456
- .multipliedBy(BigNumber(10).pow(streamTokenDecimals))
402
+ .multipliedBy(BigNumber(10).pow(payrollTokenDecimals))
457
403
  .toFixed(0));
458
- const streamVaultAta = getAssociatedTokenAddressSync(streamToken, streamVault, true);
459
- const ix = await createTopupStreamInstruction(program, {
404
+ const payrollVaultAta = getAssociatedTokenAddressSync(payrollToken, payrollVault, true);
405
+ const ix = await createTopupPayrollInstruction(payrollProgram, {
460
406
  caller,
461
407
  sender,
462
408
  senderAta,
463
- streamConfig,
464
- streamMetadata,
465
- streamToken,
466
- streamVault,
467
- streamVaultAta,
409
+ payrollConfig,
410
+ payrollMetadata: payrollMetadata,
411
+ payrollToken,
412
+ payrollVault,
413
+ payrollVaultAta,
468
414
  }, {
469
415
  extra: amount,
470
416
  });
471
- return createPayload(program, caller, [ix]);
417
+ return createPayload(payrollProgram, caller, [ix]);
472
418
  }