@primuslabs/fund-js-sdk 0.1.29 → 0.1.30

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/index.js CHANGED
@@ -176,6 +176,10 @@ var getErrArrFn = (error) => {
176
176
  return curErrorStrArr;
177
177
  };
178
178
  var formatErrFn = (error) => {
179
+ try {
180
+ console.log("error:", JSON.stringify(error));
181
+ } catch {
182
+ }
179
183
  let formatError = error;
180
184
  const curErrorStrArr = getErrArrFn(error);
181
185
  const userRejectErrStrArr = ["user rejected", "approval denied"];
@@ -2986,11 +2990,52 @@ var getTxIsOnProcess = (err) => {
2986
2990
  const isOnProcess = hasErrorFlagFn(curErrorStrArr, strArr);
2987
2991
  return isOnProcess;
2988
2992
  };
2989
- async function isSolanaBalanceZero(connection, userPK) {
2993
+ async function getSolanaBalance(connection, userPK) {
2990
2994
  const balanceLamports = await connection.getBalance(userPK);
2991
- const balanceSOL = balanceLamports / 1e9;
2992
- console.log(`Account balance: ${balanceSOL} SOL`);
2993
- return balanceSOL <= 0;
2995
+ return balanceLamports;
2996
+ }
2997
+ async function isInsufficentSolanaBalance(connection, userPK, requireBalance) {
2998
+ const balanceLamports = await getSolanaBalance(connection, userPK);
2999
+ console.log("use balance:", balanceLamports);
3000
+ const BIBalance = BigInt(balanceLamports);
3001
+ const BIRequire = BigInt(requireBalance);
3002
+ return BIBalance < BIRequire;
3003
+ }
3004
+ var SOL_TO_LAMPORTS = 1e9;
3005
+ function solToLamports(sol) {
3006
+ return sol * SOL_TO_LAMPORTS;
3007
+ }
3008
+ function getPrimusFee() {
3009
+ return solToLamports(25e-4);
3010
+ }
3011
+ function getFee() {
3012
+ return solToLamports(1e-3);
3013
+ }
3014
+ async function checkIfATAExists(connection, ata, tokenProgram) {
3015
+ try {
3016
+ const accountInfo = await (0, import_spl_token.getAccount)(connection, ata, void 0, tokenProgram);
3017
+ console.log("ATA exists, balance:", Number(accountInfo.amount) / 10 ** 9);
3018
+ return true;
3019
+ } catch (e) {
3020
+ if (e.message.includes("TokenAccountNotFoundError")) {
3021
+ console.log("ATA not found");
3022
+ return false;
3023
+ } else {
3024
+ console.error("Unexpected error:", e);
3025
+ return false;
3026
+ }
3027
+ }
3028
+ }
3029
+ async function getRentExemption(connection, ata, tokenProgram) {
3030
+ const isExist = await checkIfATAExists(connection, ata, tokenProgram);
3031
+ if (!isExist) {
3032
+ const TOKEN_ACCOUNT_SIZE = 165;
3033
+ const rentExemption = await connection.getMinimumBalanceForRentExemption(TOKEN_ACCOUNT_SIZE);
3034
+ console.log(`Estimated rentExemption:: ${rentExemption} lamports (${rentExemption.toFixed(6)} SOL)`);
3035
+ return rentExemption;
3036
+ } else {
3037
+ return 0;
3038
+ }
2994
3039
  }
2995
3040
 
2996
3041
  // src/config/redPacketIdl.json
@@ -5857,7 +5902,8 @@ async function reClaim({
5857
5902
  provider,
5858
5903
  zktlsProgram,
5859
5904
  reId,
5860
- attObj
5905
+ attObj,
5906
+ walletName
5861
5907
  }) {
5862
5908
  return new Promise(async (resolve, reject) => {
5863
5909
  const [redEnvelopePda] = getPrimusRedEnvelopePda({ programId: redEnvelopeProgram.programId });
@@ -5866,13 +5912,6 @@ async function reClaim({
5866
5912
  console.log("primusZktlsPda:", primusZktlsPda.toBase58());
5867
5913
  console.log("reRecordPda:", reRecordPda.toBase58());
5868
5914
  const attRecipient = new import_web33.PublicKey(attObj.recipient);
5869
- const isEmptyWallet = await isSolanaBalanceZero(provider.connection, attRecipient);
5870
- if (isEmptyWallet) {
5871
- const err = "insufficient";
5872
- const formatErr = formatErrFn(err);
5873
- reject(formatErr);
5874
- return;
5875
- }
5876
5915
  const redEnvelopeState = await redEnvelopeProgram.account.redEnvelopeState.fetch(redEnvelopePda);
5877
5916
  console.log("redEnvelopeState.feeRecipient", redEnvelopeState.feeRecipient.toBase58());
5878
5917
  const feeRecipient = redEnvelopeState.feeRecipient;
@@ -5949,6 +5988,18 @@ async function reClaim({
5949
5988
  tx = new import_web33.Transaction().add(instruction);
5950
5989
  tx.feePayer = userKey;
5951
5990
  tx.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;
5991
+ if (walletName?.toLowerCase() == "phantom") {
5992
+ let totalCost = reRecord.tokenType == ERC20_TYPE ? await getRentExemption(provider.connection, toTokenAccount, tokenProgram) : 0;
5993
+ totalCost += getPrimusFee();
5994
+ totalCost += getFee();
5995
+ const isInsufficent = await isInsufficentSolanaBalance(provider.connection, attRecipient, totalCost);
5996
+ if (isInsufficent) {
5997
+ const err = "insufficient";
5998
+ const formatErr = formatErrFn(err);
5999
+ reject(formatErr);
6000
+ return;
6001
+ }
6002
+ }
5952
6003
  signatureStr = await provider.sendAndConfirm(tx);
5953
6004
  return resolve(signatureStr);
5954
6005
  console.log("UnSigned tx size:", tx.serialize({ requireAllSignatures: false, verifySignatures: false }).length, "bytes");
@@ -6116,7 +6167,7 @@ var FundOnSolanaForRedPacket = class {
6116
6167
  }
6117
6168
  });
6118
6169
  }
6119
- async claim(redPacketId, attestation) {
6170
+ async claim(redPacketId, attestation, walletName) {
6120
6171
  return new Promise(async (resolve, reject) => {
6121
6172
  try {
6122
6173
  const zktlsProgram = getProgram(zktlsIdl_default, this.provider);
@@ -6128,7 +6179,8 @@ var FundOnSolanaForRedPacket = class {
6128
6179
  provider: this.provider,
6129
6180
  zktlsProgram,
6130
6181
  reId: formatReId,
6131
- attObj
6182
+ attObj,
6183
+ walletName
6132
6184
  });
6133
6185
  return resolve(result);
6134
6186
  } catch (error) {
@@ -6715,12 +6767,12 @@ var PrimusFund = class {
6715
6767
  }
6716
6768
  });
6717
6769
  }
6718
- async claimOnSolanaForRedPacket(redPacketId, attestation) {
6770
+ async claimOnSolanaForRedPacket(redPacketId, attestation, walletName) {
6719
6771
  return new Promise(async (resolve, reject) => {
6720
6772
  try {
6721
6773
  let formatAttestation2 = { ...attestation, responseResolve: attestation.reponseResolve };
6722
6774
  delete formatAttestation2.reponseResolve;
6723
- const result = await this._fundOnSolanaForRedPacket?.claim(redPacketId, formatAttestation2);
6775
+ const result = await this._fundOnSolanaForRedPacket?.claim(redPacketId, formatAttestation2, walletName);
6724
6776
  return resolve(result);
6725
6777
  } catch (error) {
6726
6778
  return reject(error);
package/dist/index.mjs CHANGED
@@ -142,6 +142,10 @@ var getErrArrFn = (error) => {
142
142
  return curErrorStrArr;
143
143
  };
144
144
  var formatErrFn = (error) => {
145
+ try {
146
+ console.log("error:", JSON.stringify(error));
147
+ } catch {
148
+ }
145
149
  let formatError = error;
146
150
  const curErrorStrArr = getErrArrFn(error);
147
151
  const userRejectErrStrArr = ["user rejected", "approval denied"];
@@ -2738,7 +2742,7 @@ import * as anchor3 from "@coral-xyz/anchor";
2738
2742
  import { Program } from "@coral-xyz/anchor";
2739
2743
  import * as anchor from "@coral-xyz/anchor";
2740
2744
  import { PublicKey } from "@solana/web3.js";
2741
- import { getMint, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token";
2745
+ import { getMint, TOKEN_2022_PROGRAM_ID, getAccount } from "@solana/spl-token";
2742
2746
  import { encode as encodeBase58 } from "micro-base58";
2743
2747
  import * as borsh from "borsh";
2744
2748
  var { deserialize } = borsh;
@@ -2952,11 +2956,52 @@ var getTxIsOnProcess = (err) => {
2952
2956
  const isOnProcess = hasErrorFlagFn(curErrorStrArr, strArr);
2953
2957
  return isOnProcess;
2954
2958
  };
2955
- async function isSolanaBalanceZero(connection, userPK) {
2959
+ async function getSolanaBalance(connection, userPK) {
2956
2960
  const balanceLamports = await connection.getBalance(userPK);
2957
- const balanceSOL = balanceLamports / 1e9;
2958
- console.log(`Account balance: ${balanceSOL} SOL`);
2959
- return balanceSOL <= 0;
2961
+ return balanceLamports;
2962
+ }
2963
+ async function isInsufficentSolanaBalance(connection, userPK, requireBalance) {
2964
+ const balanceLamports = await getSolanaBalance(connection, userPK);
2965
+ console.log("use balance:", balanceLamports);
2966
+ const BIBalance = BigInt(balanceLamports);
2967
+ const BIRequire = BigInt(requireBalance);
2968
+ return BIBalance < BIRequire;
2969
+ }
2970
+ var SOL_TO_LAMPORTS = 1e9;
2971
+ function solToLamports(sol) {
2972
+ return sol * SOL_TO_LAMPORTS;
2973
+ }
2974
+ function getPrimusFee() {
2975
+ return solToLamports(25e-4);
2976
+ }
2977
+ function getFee() {
2978
+ return solToLamports(1e-3);
2979
+ }
2980
+ async function checkIfATAExists(connection, ata, tokenProgram) {
2981
+ try {
2982
+ const accountInfo = await getAccount(connection, ata, void 0, tokenProgram);
2983
+ console.log("ATA exists, balance:", Number(accountInfo.amount) / 10 ** 9);
2984
+ return true;
2985
+ } catch (e) {
2986
+ if (e.message.includes("TokenAccountNotFoundError")) {
2987
+ console.log("ATA not found");
2988
+ return false;
2989
+ } else {
2990
+ console.error("Unexpected error:", e);
2991
+ return false;
2992
+ }
2993
+ }
2994
+ }
2995
+ async function getRentExemption(connection, ata, tokenProgram) {
2996
+ const isExist = await checkIfATAExists(connection, ata, tokenProgram);
2997
+ if (!isExist) {
2998
+ const TOKEN_ACCOUNT_SIZE = 165;
2999
+ const rentExemption = await connection.getMinimumBalanceForRentExemption(TOKEN_ACCOUNT_SIZE);
3000
+ console.log(`Estimated rentExemption:: ${rentExemption} lamports (${rentExemption.toFixed(6)} SOL)`);
3001
+ return rentExemption;
3002
+ } else {
3003
+ return 0;
3004
+ }
2960
3005
  }
2961
3006
 
2962
3007
  // src/config/redPacketIdl.json
@@ -5830,7 +5875,8 @@ async function reClaim({
5830
5875
  provider,
5831
5876
  zktlsProgram,
5832
5877
  reId,
5833
- attObj
5878
+ attObj,
5879
+ walletName
5834
5880
  }) {
5835
5881
  return new Promise(async (resolve, reject) => {
5836
5882
  const [redEnvelopePda] = getPrimusRedEnvelopePda({ programId: redEnvelopeProgram.programId });
@@ -5839,13 +5885,6 @@ async function reClaim({
5839
5885
  console.log("primusZktlsPda:", primusZktlsPda.toBase58());
5840
5886
  console.log("reRecordPda:", reRecordPda.toBase58());
5841
5887
  const attRecipient = new PublicKey3(attObj.recipient);
5842
- const isEmptyWallet = await isSolanaBalanceZero(provider.connection, attRecipient);
5843
- if (isEmptyWallet) {
5844
- const err = "insufficient";
5845
- const formatErr = formatErrFn(err);
5846
- reject(formatErr);
5847
- return;
5848
- }
5849
5888
  const redEnvelopeState = await redEnvelopeProgram.account.redEnvelopeState.fetch(redEnvelopePda);
5850
5889
  console.log("redEnvelopeState.feeRecipient", redEnvelopeState.feeRecipient.toBase58());
5851
5890
  const feeRecipient = redEnvelopeState.feeRecipient;
@@ -5922,6 +5961,18 @@ async function reClaim({
5922
5961
  tx = new Transaction().add(instruction);
5923
5962
  tx.feePayer = userKey;
5924
5963
  tx.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;
5964
+ if (walletName?.toLowerCase() == "phantom") {
5965
+ let totalCost = reRecord.tokenType == ERC20_TYPE ? await getRentExemption(provider.connection, toTokenAccount, tokenProgram) : 0;
5966
+ totalCost += getPrimusFee();
5967
+ totalCost += getFee();
5968
+ const isInsufficent = await isInsufficentSolanaBalance(provider.connection, attRecipient, totalCost);
5969
+ if (isInsufficent) {
5970
+ const err = "insufficient";
5971
+ const formatErr = formatErrFn(err);
5972
+ reject(formatErr);
5973
+ return;
5974
+ }
5975
+ }
5925
5976
  signatureStr = await provider.sendAndConfirm(tx);
5926
5977
  return resolve(signatureStr);
5927
5978
  console.log("UnSigned tx size:", tx.serialize({ requireAllSignatures: false, verifySignatures: false }).length, "bytes");
@@ -6089,7 +6140,7 @@ var FundOnSolanaForRedPacket = class {
6089
6140
  }
6090
6141
  });
6091
6142
  }
6092
- async claim(redPacketId, attestation) {
6143
+ async claim(redPacketId, attestation, walletName) {
6093
6144
  return new Promise(async (resolve, reject) => {
6094
6145
  try {
6095
6146
  const zktlsProgram = getProgram(zktlsIdl_default, this.provider);
@@ -6101,7 +6152,8 @@ var FundOnSolanaForRedPacket = class {
6101
6152
  provider: this.provider,
6102
6153
  zktlsProgram,
6103
6154
  reId: formatReId,
6104
- attObj
6155
+ attObj,
6156
+ walletName
6105
6157
  });
6106
6158
  return resolve(result);
6107
6159
  } catch (error) {
@@ -6688,12 +6740,12 @@ var PrimusFund = class {
6688
6740
  }
6689
6741
  });
6690
6742
  }
6691
- async claimOnSolanaForRedPacket(redPacketId, attestation) {
6743
+ async claimOnSolanaForRedPacket(redPacketId, attestation, walletName) {
6692
6744
  return new Promise(async (resolve, reject) => {
6693
6745
  try {
6694
6746
  let formatAttestation2 = { ...attestation, responseResolve: attestation.reponseResolve };
6695
6747
  delete formatAttestation2.reponseResolve;
6696
- const result = await this._fundOnSolanaForRedPacket?.claim(redPacketId, formatAttestation2);
6748
+ const result = await this._fundOnSolanaForRedPacket?.claim(redPacketId, formatAttestation2, walletName);
6697
6749
  return resolve(result);
6698
6750
  } catch (error) {
6699
6751
  return reject(error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primuslabs/fund-js-sdk",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "author": "Primus Labs <dev@primuslabs.org>",
5
5
  "description": "Primus fund js sdk",
6
6
  "repository": {