@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/LICENSE +9 -0
- package/dist/constants.d.ts +0 -2
- package/dist/constants.js +0 -9
- package/dist/instructions.d.ts +43 -75
- package/dist/instructions.js +48 -93
- package/dist/pda.d.ts +2 -2
- package/dist/pda.js +9 -6
- package/dist/program.d.ts +2 -0
- package/dist/program.js +4 -0
- package/dist/services.d.ts +13 -15
- package/dist/services.js +174 -228
- package/dist/types.d.ts +34 -67
- package/dist/utils.d.ts +3 -4
- package/dist/utils.js +37 -16
- package/package.json +8 -6
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,
|
|
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 {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
export async function getPayrollConfig(
|
|
16
|
-
const [
|
|
17
|
-
const
|
|
18
|
-
if (!
|
|
19
|
-
throw new Error(`
|
|
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:
|
|
24
|
-
admin:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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:
|
|
39
|
+
feeVault: payrollConfig.feeVault,
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
|
-
export async function getWhitelistedTokens(
|
|
43
|
-
const [config] =
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
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
|
|
108
|
-
const metadataInfo = await program.account.paymentStream.fetch(translateAddress(
|
|
109
|
-
const
|
|
110
|
-
const
|
|
111
|
-
const
|
|
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(
|
|
116
|
+
.div(unitsPerPayrollToken)
|
|
114
117
|
.toFixed();
|
|
115
118
|
const withdrawnAmount = BigNumber(metadataInfo.financials.withdrawnAmount.toString())
|
|
116
|
-
.div(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
261
|
-
const [
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
|
|
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
|
|
202
|
+
throw new Error("Invalid payroll frequency");
|
|
268
203
|
}
|
|
269
|
-
const senderAta = getAssociatedTokenAddressSync(
|
|
270
|
-
const receiverAta = getAssociatedTokenAddressSync(
|
|
271
|
-
const
|
|
272
|
-
const [
|
|
273
|
-
const
|
|
274
|
-
const
|
|
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(
|
|
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
|
|
280
|
-
|
|
281
|
-
const
|
|
282
|
-
const
|
|
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 =
|
|
287
|
-
const feeVaultAta = getAssociatedTokenAddressSync(feeToken, feeVault, true);
|
|
288
|
-
const senderFeeTokenAta = getAssociatedTokenAddressSync(feeToken, sender, true);
|
|
289
|
-
const feeVaultAtaInfo = await
|
|
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
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
|
|
250
|
+
payrollToken,
|
|
305
251
|
sender,
|
|
306
252
|
receiverAta,
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
253
|
+
payrollMetadata: payrollMetadataKeypair.publicKey,
|
|
254
|
+
payrollVault,
|
|
255
|
+
payrollVaultAta,
|
|
310
256
|
withdrawAccount: withdrawer,
|
|
311
257
|
}, {
|
|
312
258
|
autoTopupDelegate: Number(params.delegateAutoTopup),
|
|
313
|
-
|
|
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
|
-
|
|
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(
|
|
333
|
-
return createPayload(
|
|
278
|
+
ixs.push(createpayrollIx);
|
|
279
|
+
return createPayload(payrollProgram, feePayer, ixs, [payrollMetadataKeypair]);
|
|
334
280
|
}
|
|
335
|
-
export async function
|
|
281
|
+
export async function cancelPayroll(program, params) {
|
|
336
282
|
const user = translateAddress(params.user);
|
|
337
|
-
const
|
|
338
|
-
const
|
|
339
|
-
const
|
|
340
|
-
const
|
|
341
|
-
const 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(
|
|
289
|
+
if (user.equals(payroller)) {
|
|
344
290
|
otherParty = receiver;
|
|
345
291
|
}
|
|
346
292
|
else if (user.equals(receiver)) {
|
|
347
|
-
otherParty =
|
|
293
|
+
otherParty = payroller;
|
|
348
294
|
}
|
|
349
295
|
else {
|
|
350
|
-
throw new Error("User must be either
|
|
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(
|
|
354
|
-
const otherPartyAta = getAssociatedTokenAddressSync(
|
|
355
|
-
const [
|
|
356
|
-
const
|
|
357
|
-
const ix = await
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
309
|
+
payrollMetadata,
|
|
310
|
+
payrollToken,
|
|
311
|
+
payrollVault,
|
|
312
|
+
payrollVaultAta,
|
|
367
313
|
});
|
|
368
314
|
return createPayload(program, feePayer, [ix]);
|
|
369
315
|
}
|
|
370
|
-
export async function
|
|
371
|
-
const
|
|
372
|
-
const
|
|
373
|
-
const user =
|
|
374
|
-
const ix = await
|
|
375
|
-
|
|
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
|
|
381
|
-
const [
|
|
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
|
|
392
|
-
const
|
|
393
|
-
const
|
|
394
|
-
const receiverAta = getAssociatedTokenAddressSync(
|
|
395
|
-
const [
|
|
396
|
-
const
|
|
397
|
-
const ix = await
|
|
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
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
346
|
+
payrollConfig,
|
|
347
|
+
payrollMetadata,
|
|
348
|
+
payrollToken,
|
|
349
|
+
payrollVault,
|
|
350
|
+
payrollVaultAta,
|
|
405
351
|
withdrawer,
|
|
406
352
|
feePayer,
|
|
407
353
|
});
|
|
408
|
-
return createPayload(
|
|
354
|
+
return createPayload(payrollProgram, withdrawer, [ix]);
|
|
409
355
|
}
|
|
410
|
-
export async function
|
|
411
|
-
const
|
|
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
|
-
|
|
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(
|
|
367
|
+
export async function setTopupDelegate(payrollProgram, configProgram, params) {
|
|
422
368
|
const sender = translateAddress(params.sender);
|
|
423
|
-
const
|
|
424
|
-
const
|
|
425
|
-
const
|
|
426
|
-
const senderAta = getAssociatedTokenAddressSync(
|
|
427
|
-
const [
|
|
428
|
-
const [
|
|
429
|
-
const
|
|
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(
|
|
377
|
+
.multipliedBy(BigNumber(10).pow(payrollTokenDecimals))
|
|
432
378
|
.toFixed(0));
|
|
433
|
-
const ix = await createSetTopupDelegateInstruction(
|
|
379
|
+
const ix = await createSetTopupDelegateInstruction(payrollProgram, {
|
|
434
380
|
sender,
|
|
435
381
|
senderAta,
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
382
|
+
payrollConfig,
|
|
383
|
+
payrollMetadata,
|
|
384
|
+
payrollToken,
|
|
385
|
+
payrollVault,
|
|
440
386
|
}, {
|
|
441
387
|
amount,
|
|
442
388
|
});
|
|
443
|
-
return createPayload(
|
|
389
|
+
return createPayload(payrollProgram, sender, [ix]);
|
|
444
390
|
}
|
|
445
|
-
export async function
|
|
391
|
+
export async function topupPayroll(payrollProgram, configProgram, params) {
|
|
446
392
|
const sender = translateAddress(params.sender);
|
|
447
|
-
const
|
|
393
|
+
const payrollMetadata = translateAddress(params.payrollMetadata);
|
|
448
394
|
const caller = params.caller ? translateAddress(params.caller) : sender;
|
|
449
|
-
const
|
|
450
|
-
const
|
|
451
|
-
const senderAta = getAssociatedTokenAddressSync(
|
|
452
|
-
const [
|
|
453
|
-
const [
|
|
454
|
-
const
|
|
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(
|
|
402
|
+
.multipliedBy(BigNumber(10).pow(payrollTokenDecimals))
|
|
457
403
|
.toFixed(0));
|
|
458
|
-
const
|
|
459
|
-
const ix = await
|
|
404
|
+
const payrollVaultAta = getAssociatedTokenAddressSync(payrollToken, payrollVault, true);
|
|
405
|
+
const ix = await createTopupPayrollInstruction(payrollProgram, {
|
|
460
406
|
caller,
|
|
461
407
|
sender,
|
|
462
408
|
senderAta,
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
409
|
+
payrollConfig,
|
|
410
|
+
payrollMetadata: payrollMetadata,
|
|
411
|
+
payrollToken,
|
|
412
|
+
payrollVault,
|
|
413
|
+
payrollVaultAta,
|
|
468
414
|
}, {
|
|
469
415
|
extra: amount,
|
|
470
416
|
});
|
|
471
|
-
return createPayload(
|
|
417
|
+
return createPayload(payrollProgram, caller, [ix]);
|
|
472
418
|
}
|