@pump-fun/pump-sdk 1.18.2 → 1.18.4
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/esm/index.js +45 -20
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +45 -20
- package/package.json +2 -2
- package/src/bondingCurve.ts +25 -19
- package/src/fees.ts +89 -79
- package/src/pda.ts +5 -1
- package/src/sdk.ts +23 -0
package/dist/esm/index.js
CHANGED
|
@@ -4777,8 +4777,9 @@ function getBuyTokenAmountFromSolAmount({
|
|
|
4777
4777
|
return new BN(0);
|
|
4778
4778
|
}
|
|
4779
4779
|
let isNewBondingCurve = false;
|
|
4780
|
-
if (bondingCurve === null) {
|
|
4780
|
+
if (bondingCurve === null || mintSupply === null) {
|
|
4781
4781
|
bondingCurve = newBondingCurve(global);
|
|
4782
|
+
mintSupply = global.tokenTotalSupply;
|
|
4782
4783
|
isNewBondingCurve = true;
|
|
4783
4784
|
}
|
|
4784
4785
|
if (bondingCurve.virtualTokenReserves.eq(new BN(0))) {
|
|
@@ -4814,8 +4815,9 @@ function getBuySolAmountFromTokenAmount({
|
|
|
4814
4815
|
return new BN(0);
|
|
4815
4816
|
}
|
|
4816
4817
|
let isNewBondingCurve = false;
|
|
4817
|
-
if (bondingCurve === null) {
|
|
4818
|
+
if (bondingCurve === null || mintSupply === null) {
|
|
4818
4819
|
bondingCurve = newBondingCurve(global);
|
|
4820
|
+
mintSupply = global.tokenTotalSupply;
|
|
4819
4821
|
isNewBondingCurve = true;
|
|
4820
4822
|
}
|
|
4821
4823
|
if (bondingCurve.virtualTokenReserves.eq(new BN(0))) {
|
|
@@ -4827,14 +4829,16 @@ function getBuySolAmountFromTokenAmount({
|
|
|
4827
4829
|
virtualTokenReserves: bondingCurve.virtualTokenReserves,
|
|
4828
4830
|
virtualSolReserves: bondingCurve.virtualSolReserves
|
|
4829
4831
|
});
|
|
4830
|
-
return solCost.add(
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
|
|
4832
|
+
return solCost.add(
|
|
4833
|
+
getFee({
|
|
4834
|
+
global,
|
|
4835
|
+
feeConfig,
|
|
4836
|
+
mintSupply,
|
|
4837
|
+
bondingCurve,
|
|
4838
|
+
amount: solCost,
|
|
4839
|
+
isNewBondingCurve
|
|
4840
|
+
})
|
|
4841
|
+
);
|
|
4838
4842
|
}
|
|
4839
4843
|
function getSellSolAmountFromTokenAmount({
|
|
4840
4844
|
global,
|
|
@@ -4854,14 +4858,16 @@ function getSellSolAmountFromTokenAmount({
|
|
|
4854
4858
|
virtualTokenReserves: bondingCurve.virtualTokenReserves,
|
|
4855
4859
|
virtualSolReserves: bondingCurve.virtualSolReserves
|
|
4856
4860
|
});
|
|
4857
|
-
return solCost.sub(
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4861
|
+
return solCost.sub(
|
|
4862
|
+
getFee({
|
|
4863
|
+
global,
|
|
4864
|
+
feeConfig,
|
|
4865
|
+
mintSupply,
|
|
4866
|
+
bondingCurve,
|
|
4867
|
+
amount: solCost,
|
|
4868
|
+
isNewBondingCurve: false
|
|
4869
|
+
})
|
|
4870
|
+
);
|
|
4865
4871
|
}
|
|
4866
4872
|
function getStaticRandomFeeRecipient() {
|
|
4867
4873
|
const randomIndex = Math.floor(Math.random() * CURRENT_FEE_RECIPIENTS.length);
|
|
@@ -4935,7 +4941,7 @@ function computeFeesBps({
|
|
|
4935
4941
|
virtualSolReserves,
|
|
4936
4942
|
virtualTokenReserves
|
|
4937
4943
|
}) {
|
|
4938
|
-
if (feeConfig != null
|
|
4944
|
+
if (feeConfig != null) {
|
|
4939
4945
|
const marketCap = bondingCurveMarketCap({
|
|
4940
4946
|
mintSupply,
|
|
4941
4947
|
virtualSolReserves,
|
|
@@ -4951,7 +4957,10 @@ function computeFeesBps({
|
|
|
4951
4957
|
creatorFeeBps: global.creatorFeeBasisPoints
|
|
4952
4958
|
};
|
|
4953
4959
|
}
|
|
4954
|
-
function calculateFeeTier({
|
|
4960
|
+
function calculateFeeTier({
|
|
4961
|
+
feeTiers,
|
|
4962
|
+
marketCap
|
|
4963
|
+
}) {
|
|
4955
4964
|
const firstTier = feeTiers[0];
|
|
4956
4965
|
if (marketCap.lt(firstTier.marketCapLamportsThreshold)) {
|
|
4957
4966
|
return firstTier.fees;
|
|
@@ -5102,6 +5111,14 @@ var PumpSdk = class {
|
|
|
5102
5111
|
accountInfo.data
|
|
5103
5112
|
);
|
|
5104
5113
|
}
|
|
5114
|
+
decodeBondingCurveNullable(accountInfo) {
|
|
5115
|
+
try {
|
|
5116
|
+
return this.decodeBondingCurve(accountInfo);
|
|
5117
|
+
} catch (e) {
|
|
5118
|
+
console.warn("Failed to decode bonding curve", e);
|
|
5119
|
+
return null;
|
|
5120
|
+
}
|
|
5121
|
+
}
|
|
5105
5122
|
decodeGlobalVolumeAccumulator(accountInfo) {
|
|
5106
5123
|
return this.offlinePumpProgram.coder.accounts.decode(
|
|
5107
5124
|
"globalVolumeAccumulator",
|
|
@@ -5114,6 +5131,14 @@ var PumpSdk = class {
|
|
|
5114
5131
|
accountInfo.data
|
|
5115
5132
|
);
|
|
5116
5133
|
}
|
|
5134
|
+
decodeUserVolumeAccumulatorNullable(accountInfo) {
|
|
5135
|
+
try {
|
|
5136
|
+
return this.decodeUserVolumeAccumulator(accountInfo);
|
|
5137
|
+
} catch (e) {
|
|
5138
|
+
console.warn("Failed to decode user volume accumulator", e);
|
|
5139
|
+
return null;
|
|
5140
|
+
}
|
|
5141
|
+
}
|
|
5117
5142
|
async fetchGlobal() {
|
|
5118
5143
|
return await this.pumpProgram.account.global.fetch(globalPda());
|
|
5119
5144
|
}
|
package/dist/index.d.mts
CHANGED
|
@@ -9579,7 +9579,7 @@ declare function getBuySolAmountFromTokenAmount({ global, feeConfig, mintSupply,
|
|
|
9579
9579
|
declare function getSellSolAmountFromTokenAmount({ global, feeConfig, mintSupply, bondingCurve, amount, }: {
|
|
9580
9580
|
global: Global;
|
|
9581
9581
|
feeConfig: FeeConfig | null;
|
|
9582
|
-
mintSupply: BN
|
|
9582
|
+
mintSupply: BN;
|
|
9583
9583
|
bondingCurve: BondingCurve;
|
|
9584
9584
|
amount: BN;
|
|
9585
9585
|
}): BN;
|
|
@@ -9614,8 +9614,10 @@ declare class PumpSdk {
|
|
|
9614
9614
|
decodeGlobal(accountInfo: AccountInfo<Buffer>): Global;
|
|
9615
9615
|
decodeFeeConfig(accountInfo: AccountInfo<Buffer>): FeeConfig;
|
|
9616
9616
|
decodeBondingCurve(accountInfo: AccountInfo<Buffer>): BondingCurve;
|
|
9617
|
+
decodeBondingCurveNullable(accountInfo: AccountInfo<Buffer>): BondingCurve | null;
|
|
9617
9618
|
decodeGlobalVolumeAccumulator(accountInfo: AccountInfo<Buffer>): GlobalVolumeAccumulator;
|
|
9618
9619
|
decodeUserVolumeAccumulator(accountInfo: AccountInfo<Buffer>): UserVolumeAccumulator;
|
|
9620
|
+
decodeUserVolumeAccumulatorNullable(accountInfo: AccountInfo<Buffer>): UserVolumeAccumulator | null;
|
|
9619
9621
|
fetchGlobal(): Promise<Global>;
|
|
9620
9622
|
fetchFeeConfig(): Promise<FeeConfig>;
|
|
9621
9623
|
fetchBondingCurve(mint: PublicKeyInitData): Promise<BondingCurve>;
|
package/dist/index.d.ts
CHANGED
|
@@ -9579,7 +9579,7 @@ declare function getBuySolAmountFromTokenAmount({ global, feeConfig, mintSupply,
|
|
|
9579
9579
|
declare function getSellSolAmountFromTokenAmount({ global, feeConfig, mintSupply, bondingCurve, amount, }: {
|
|
9580
9580
|
global: Global;
|
|
9581
9581
|
feeConfig: FeeConfig | null;
|
|
9582
|
-
mintSupply: BN
|
|
9582
|
+
mintSupply: BN;
|
|
9583
9583
|
bondingCurve: BondingCurve;
|
|
9584
9584
|
amount: BN;
|
|
9585
9585
|
}): BN;
|
|
@@ -9614,8 +9614,10 @@ declare class PumpSdk {
|
|
|
9614
9614
|
decodeGlobal(accountInfo: AccountInfo<Buffer>): Global;
|
|
9615
9615
|
decodeFeeConfig(accountInfo: AccountInfo<Buffer>): FeeConfig;
|
|
9616
9616
|
decodeBondingCurve(accountInfo: AccountInfo<Buffer>): BondingCurve;
|
|
9617
|
+
decodeBondingCurveNullable(accountInfo: AccountInfo<Buffer>): BondingCurve | null;
|
|
9617
9618
|
decodeGlobalVolumeAccumulator(accountInfo: AccountInfo<Buffer>): GlobalVolumeAccumulator;
|
|
9618
9619
|
decodeUserVolumeAccumulator(accountInfo: AccountInfo<Buffer>): UserVolumeAccumulator;
|
|
9620
|
+
decodeUserVolumeAccumulatorNullable(accountInfo: AccountInfo<Buffer>): UserVolumeAccumulator | null;
|
|
9619
9621
|
fetchGlobal(): Promise<Global>;
|
|
9620
9622
|
fetchFeeConfig(): Promise<FeeConfig>;
|
|
9621
9623
|
fetchBondingCurve(mint: PublicKeyInitData): Promise<BondingCurve>;
|
package/dist/index.js
CHANGED
|
@@ -4838,8 +4838,9 @@ function getBuyTokenAmountFromSolAmount({
|
|
|
4838
4838
|
return new import_bn.default(0);
|
|
4839
4839
|
}
|
|
4840
4840
|
let isNewBondingCurve = false;
|
|
4841
|
-
if (bondingCurve === null) {
|
|
4841
|
+
if (bondingCurve === null || mintSupply === null) {
|
|
4842
4842
|
bondingCurve = newBondingCurve(global);
|
|
4843
|
+
mintSupply = global.tokenTotalSupply;
|
|
4843
4844
|
isNewBondingCurve = true;
|
|
4844
4845
|
}
|
|
4845
4846
|
if (bondingCurve.virtualTokenReserves.eq(new import_bn.default(0))) {
|
|
@@ -4875,8 +4876,9 @@ function getBuySolAmountFromTokenAmount({
|
|
|
4875
4876
|
return new import_bn.default(0);
|
|
4876
4877
|
}
|
|
4877
4878
|
let isNewBondingCurve = false;
|
|
4878
|
-
if (bondingCurve === null) {
|
|
4879
|
+
if (bondingCurve === null || mintSupply === null) {
|
|
4879
4880
|
bondingCurve = newBondingCurve(global);
|
|
4881
|
+
mintSupply = global.tokenTotalSupply;
|
|
4880
4882
|
isNewBondingCurve = true;
|
|
4881
4883
|
}
|
|
4882
4884
|
if (bondingCurve.virtualTokenReserves.eq(new import_bn.default(0))) {
|
|
@@ -4888,14 +4890,16 @@ function getBuySolAmountFromTokenAmount({
|
|
|
4888
4890
|
virtualTokenReserves: bondingCurve.virtualTokenReserves,
|
|
4889
4891
|
virtualSolReserves: bondingCurve.virtualSolReserves
|
|
4890
4892
|
});
|
|
4891
|
-
return solCost.add(
|
|
4892
|
-
|
|
4893
|
-
|
|
4894
|
-
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
|
|
4893
|
+
return solCost.add(
|
|
4894
|
+
getFee({
|
|
4895
|
+
global,
|
|
4896
|
+
feeConfig,
|
|
4897
|
+
mintSupply,
|
|
4898
|
+
bondingCurve,
|
|
4899
|
+
amount: solCost,
|
|
4900
|
+
isNewBondingCurve
|
|
4901
|
+
})
|
|
4902
|
+
);
|
|
4899
4903
|
}
|
|
4900
4904
|
function getSellSolAmountFromTokenAmount({
|
|
4901
4905
|
global,
|
|
@@ -4915,14 +4919,16 @@ function getSellSolAmountFromTokenAmount({
|
|
|
4915
4919
|
virtualTokenReserves: bondingCurve.virtualTokenReserves,
|
|
4916
4920
|
virtualSolReserves: bondingCurve.virtualSolReserves
|
|
4917
4921
|
});
|
|
4918
|
-
return solCost.sub(
|
|
4919
|
-
|
|
4920
|
-
|
|
4921
|
-
|
|
4922
|
-
|
|
4923
|
-
|
|
4924
|
-
|
|
4925
|
-
|
|
4922
|
+
return solCost.sub(
|
|
4923
|
+
getFee({
|
|
4924
|
+
global,
|
|
4925
|
+
feeConfig,
|
|
4926
|
+
mintSupply,
|
|
4927
|
+
bondingCurve,
|
|
4928
|
+
amount: solCost,
|
|
4929
|
+
isNewBondingCurve: false
|
|
4930
|
+
})
|
|
4931
|
+
);
|
|
4926
4932
|
}
|
|
4927
4933
|
function getStaticRandomFeeRecipient() {
|
|
4928
4934
|
const randomIndex = Math.floor(Math.random() * CURRENT_FEE_RECIPIENTS.length);
|
|
@@ -4996,7 +5002,7 @@ function computeFeesBps({
|
|
|
4996
5002
|
virtualSolReserves,
|
|
4997
5003
|
virtualTokenReserves
|
|
4998
5004
|
}) {
|
|
4999
|
-
if (feeConfig != null
|
|
5005
|
+
if (feeConfig != null) {
|
|
5000
5006
|
const marketCap = bondingCurveMarketCap({
|
|
5001
5007
|
mintSupply,
|
|
5002
5008
|
virtualSolReserves,
|
|
@@ -5012,7 +5018,10 @@ function computeFeesBps({
|
|
|
5012
5018
|
creatorFeeBps: global.creatorFeeBasisPoints
|
|
5013
5019
|
};
|
|
5014
5020
|
}
|
|
5015
|
-
function calculateFeeTier({
|
|
5021
|
+
function calculateFeeTier({
|
|
5022
|
+
feeTiers,
|
|
5023
|
+
marketCap
|
|
5024
|
+
}) {
|
|
5016
5025
|
const firstTier = feeTiers[0];
|
|
5017
5026
|
if (marketCap.lt(firstTier.marketCapLamportsThreshold)) {
|
|
5018
5027
|
return firstTier.fees;
|
|
@@ -5155,6 +5164,14 @@ var PumpSdk = class {
|
|
|
5155
5164
|
accountInfo.data
|
|
5156
5165
|
);
|
|
5157
5166
|
}
|
|
5167
|
+
decodeBondingCurveNullable(accountInfo) {
|
|
5168
|
+
try {
|
|
5169
|
+
return this.decodeBondingCurve(accountInfo);
|
|
5170
|
+
} catch (e) {
|
|
5171
|
+
console.warn("Failed to decode bonding curve", e);
|
|
5172
|
+
return null;
|
|
5173
|
+
}
|
|
5174
|
+
}
|
|
5158
5175
|
decodeGlobalVolumeAccumulator(accountInfo) {
|
|
5159
5176
|
return this.offlinePumpProgram.coder.accounts.decode(
|
|
5160
5177
|
"globalVolumeAccumulator",
|
|
@@ -5167,6 +5184,14 @@ var PumpSdk = class {
|
|
|
5167
5184
|
accountInfo.data
|
|
5168
5185
|
);
|
|
5169
5186
|
}
|
|
5187
|
+
decodeUserVolumeAccumulatorNullable(accountInfo) {
|
|
5188
|
+
try {
|
|
5189
|
+
return this.decodeUserVolumeAccumulator(accountInfo);
|
|
5190
|
+
} catch (e) {
|
|
5191
|
+
console.warn("Failed to decode user volume accumulator", e);
|
|
5192
|
+
return null;
|
|
5193
|
+
}
|
|
5194
|
+
}
|
|
5170
5195
|
async fetchGlobal() {
|
|
5171
5196
|
return await this.pumpProgram.account.global.fetch(globalPda());
|
|
5172
5197
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pump-fun/pump-sdk",
|
|
3
|
-
"version": "1.18.
|
|
3
|
+
"version": "1.18.4",
|
|
4
4
|
"description": "Pump Bonding Curve SDK",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"homepage": "https://github.com/pump-fun/pump-sdk#readme",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@coral-xyz/anchor": "^0.31.1",
|
|
42
|
-
"@pump-fun/pump-swap-sdk": "^1.7.
|
|
42
|
+
"@pump-fun/pump-swap-sdk": "^1.7.1",
|
|
43
43
|
"@solana/spl-token": "^0.4.13",
|
|
44
44
|
"@solana/web3.js": "^1.98.2",
|
|
45
45
|
"bn.js": "^5.2.2",
|
package/src/bondingCurve.ts
CHANGED
|
@@ -77,8 +77,9 @@ export function getBuyTokenAmountFromSolAmount({
|
|
|
77
77
|
|
|
78
78
|
let isNewBondingCurve = false;
|
|
79
79
|
|
|
80
|
-
if (bondingCurve === null) {
|
|
80
|
+
if (bondingCurve === null || mintSupply === null) {
|
|
81
81
|
bondingCurve = newBondingCurve(global);
|
|
82
|
+
mintSupply = global.tokenTotalSupply;
|
|
82
83
|
isNewBondingCurve = true;
|
|
83
84
|
}
|
|
84
85
|
|
|
@@ -132,8 +133,9 @@ export function getBuySolAmountFromTokenAmount({
|
|
|
132
133
|
|
|
133
134
|
let isNewBondingCurve = false;
|
|
134
135
|
|
|
135
|
-
if (bondingCurve === null) {
|
|
136
|
+
if (bondingCurve === null || mintSupply === null) {
|
|
136
137
|
bondingCurve = newBondingCurve(global);
|
|
138
|
+
mintSupply = global.tokenTotalSupply;
|
|
137
139
|
isNewBondingCurve = true;
|
|
138
140
|
}
|
|
139
141
|
|
|
@@ -150,14 +152,16 @@ export function getBuySolAmountFromTokenAmount({
|
|
|
150
152
|
virtualSolReserves: bondingCurve.virtualSolReserves,
|
|
151
153
|
});
|
|
152
154
|
|
|
153
|
-
return solCost.add(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
155
|
+
return solCost.add(
|
|
156
|
+
getFee({
|
|
157
|
+
global,
|
|
158
|
+
feeConfig,
|
|
159
|
+
mintSupply,
|
|
160
|
+
bondingCurve,
|
|
161
|
+
amount: solCost,
|
|
162
|
+
isNewBondingCurve,
|
|
163
|
+
}),
|
|
164
|
+
);
|
|
161
165
|
}
|
|
162
166
|
|
|
163
167
|
export function getSellSolAmountFromTokenAmount({
|
|
@@ -169,7 +173,7 @@ export function getSellSolAmountFromTokenAmount({
|
|
|
169
173
|
}: {
|
|
170
174
|
global: Global;
|
|
171
175
|
feeConfig: FeeConfig | null;
|
|
172
|
-
mintSupply: BN
|
|
176
|
+
mintSupply: BN;
|
|
173
177
|
bondingCurve: BondingCurve;
|
|
174
178
|
amount: BN;
|
|
175
179
|
}): BN {
|
|
@@ -188,14 +192,16 @@ export function getSellSolAmountFromTokenAmount({
|
|
|
188
192
|
virtualSolReserves: bondingCurve.virtualSolReserves,
|
|
189
193
|
});
|
|
190
194
|
|
|
191
|
-
return solCost.sub(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
195
|
+
return solCost.sub(
|
|
196
|
+
getFee({
|
|
197
|
+
global,
|
|
198
|
+
feeConfig,
|
|
199
|
+
mintSupply,
|
|
200
|
+
bondingCurve,
|
|
201
|
+
amount: solCost,
|
|
202
|
+
isNewBondingCurve: false,
|
|
203
|
+
}),
|
|
204
|
+
);
|
|
199
205
|
}
|
|
200
206
|
|
|
201
207
|
export function getStaticRandomFeeRecipient(): PublicKey {
|
package/src/fees.ts
CHANGED
|
@@ -4,115 +4,125 @@ import { FeeConfig, Global, Fees, BondingCurve, FeeTier } from "./state";
|
|
|
4
4
|
import { bondingCurveMarketCap } from "./bondingCurve";
|
|
5
5
|
|
|
6
6
|
export interface CalculatedFeesBps {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
protocolFeeBps: BN;
|
|
8
|
+
creatorFeeBps: BN;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export interface CalculatedFees {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
protocolFee: BN;
|
|
13
|
+
creatorFee: BN;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export function createFeeConfigFromGlobalConfig(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
16
|
+
export function createFeeConfigFromGlobalConfig(
|
|
17
|
+
globalConfig: Global,
|
|
18
|
+
): FeeConfig {
|
|
19
|
+
let fees: Fees = {
|
|
20
|
+
lpFeeBps: new BN(0), // unused for pump
|
|
21
|
+
protocolFeeBps: globalConfig.feeBasisPoints,
|
|
22
|
+
creatorFeeBps: globalConfig.creatorFeeBasisPoints,
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
admin: globalConfig.authority,
|
|
26
|
+
flatFees: fees,
|
|
27
|
+
feeTiers: [
|
|
28
|
+
{
|
|
29
|
+
marketCapLamportsThreshold: new BN(0), // unused for pump
|
|
30
|
+
fees,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export function getFee({
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
global,
|
|
38
|
+
feeConfig,
|
|
39
|
+
mintSupply,
|
|
40
|
+
bondingCurve,
|
|
41
|
+
amount,
|
|
42
|
+
isNewBondingCurve,
|
|
41
43
|
}: {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
global: Global;
|
|
45
|
+
feeConfig: FeeConfig | null;
|
|
46
|
+
mintSupply: BN;
|
|
47
|
+
bondingCurve: BondingCurve;
|
|
48
|
+
amount: BN;
|
|
49
|
+
isNewBondingCurve: boolean;
|
|
48
50
|
}) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
global,
|
|
52
|
-
feeConfig,
|
|
53
|
-
mintSupply,
|
|
54
|
-
virtualSolReserves,
|
|
55
|
-
virtualTokenReserves,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
return fee(amount, protocolFeeBps).add(
|
|
59
|
-
isNewBondingCurve || !PublicKey.default.equals(bondingCurve.creator) ? fee(amount, creatorFeeBps) : new BN(0)
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function computeFeesBps({
|
|
51
|
+
const { virtualSolReserves, virtualTokenReserves } = bondingCurve;
|
|
52
|
+
const { protocolFeeBps, creatorFeeBps } = computeFeesBps({
|
|
64
53
|
global,
|
|
65
54
|
feeConfig,
|
|
66
55
|
mintSupply,
|
|
67
56
|
virtualSolReserves,
|
|
68
57
|
virtualTokenReserves,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return fee(amount, protocolFeeBps).add(
|
|
61
|
+
isNewBondingCurve || !PublicKey.default.equals(bondingCurve.creator)
|
|
62
|
+
? fee(amount, creatorFeeBps)
|
|
63
|
+
: new BN(0),
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function computeFeesBps({
|
|
68
|
+
global,
|
|
69
|
+
feeConfig,
|
|
70
|
+
mintSupply,
|
|
71
|
+
virtualSolReserves,
|
|
72
|
+
virtualTokenReserves,
|
|
69
73
|
}: {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
global: Global;
|
|
75
|
+
feeConfig: FeeConfig | null;
|
|
76
|
+
mintSupply: BN;
|
|
77
|
+
virtualSolReserves: BN;
|
|
78
|
+
virtualTokenReserves: BN;
|
|
75
79
|
}): CalculatedFeesBps {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
if (feeConfig != null) {
|
|
81
|
+
const marketCap = bondingCurveMarketCap({
|
|
82
|
+
mintSupply,
|
|
83
|
+
virtualSolReserves,
|
|
84
|
+
virtualTokenReserves,
|
|
85
|
+
});
|
|
82
86
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
return calculateFeeTier({
|
|
88
|
+
feeTiers: feeConfig.feeTiers,
|
|
89
|
+
marketCap,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
88
92
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
+
return {
|
|
94
|
+
protocolFeeBps: global.feeBasisPoints,
|
|
95
|
+
creatorFeeBps: global.creatorFeeBasisPoints,
|
|
96
|
+
};
|
|
93
97
|
}
|
|
94
98
|
|
|
95
99
|
/// rust reference: pump-fees-math::calculate_fee_tier()
|
|
96
|
-
export function calculateFeeTier({
|
|
97
|
-
|
|
100
|
+
export function calculateFeeTier({
|
|
101
|
+
feeTiers,
|
|
102
|
+
marketCap,
|
|
103
|
+
}: {
|
|
104
|
+
feeTiers: FeeTier[];
|
|
105
|
+
marketCap: BN;
|
|
106
|
+
}): Fees {
|
|
107
|
+
const firstTier = feeTiers[0];
|
|
98
108
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
109
|
+
if (marketCap.lt(firstTier.marketCapLamportsThreshold)) {
|
|
110
|
+
return firstTier.fees;
|
|
111
|
+
}
|
|
102
112
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
113
|
+
for (const tier of feeTiers.slice().reverse()) {
|
|
114
|
+
if (marketCap.gte(tier.marketCapLamportsThreshold)) {
|
|
115
|
+
return tier.fees;
|
|
107
116
|
}
|
|
117
|
+
}
|
|
108
118
|
|
|
109
|
-
|
|
119
|
+
return firstTier.fees;
|
|
110
120
|
}
|
|
111
121
|
|
|
112
122
|
function fee(amount: BN, feeBasisPoints: BN): BN {
|
|
113
|
-
|
|
123
|
+
return ceilDiv(amount.mul(feeBasisPoints), new BN(10_000));
|
|
114
124
|
}
|
|
115
125
|
|
|
116
126
|
function ceilDiv(a: BN, b: BN): BN {
|
|
117
|
-
|
|
127
|
+
return a.add(b.subn(1)).div(b);
|
|
118
128
|
}
|
package/src/pda.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { PublicKey, PublicKeyInitData } from "@solana/web3.js";
|
|
2
2
|
import { NATIVE_MINT } from "@solana/spl-token";
|
|
3
3
|
import { poolPda } from "@pump-fun/pump-swap-sdk";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
PUMP_AMM_PROGRAM_ID,
|
|
6
|
+
PUMP_FEE_PROGRAM_ID,
|
|
7
|
+
PUMP_PROGRAM_ID,
|
|
8
|
+
} from "./sdk";
|
|
5
9
|
|
|
6
10
|
export function globalPda(): PublicKey {
|
|
7
11
|
const [globalPda] = PublicKey.findProgramAddressSync(
|
package/src/sdk.ts
CHANGED
|
@@ -104,6 +104,17 @@ export class PumpSdk {
|
|
|
104
104
|
);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
decodeBondingCurveNullable(
|
|
108
|
+
accountInfo: AccountInfo<Buffer>,
|
|
109
|
+
): BondingCurve | null {
|
|
110
|
+
try {
|
|
111
|
+
return this.decodeBondingCurve(accountInfo);
|
|
112
|
+
} catch (e) {
|
|
113
|
+
console.warn("Failed to decode bonding curve", e);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
107
118
|
decodeGlobalVolumeAccumulator(
|
|
108
119
|
accountInfo: AccountInfo<Buffer>,
|
|
109
120
|
): GlobalVolumeAccumulator {
|
|
@@ -121,6 +132,18 @@ export class PumpSdk {
|
|
|
121
132
|
accountInfo.data,
|
|
122
133
|
);
|
|
123
134
|
}
|
|
135
|
+
|
|
136
|
+
decodeUserVolumeAccumulatorNullable(
|
|
137
|
+
accountInfo: AccountInfo<Buffer>,
|
|
138
|
+
): UserVolumeAccumulator | null {
|
|
139
|
+
try {
|
|
140
|
+
return this.decodeUserVolumeAccumulator(accountInfo);
|
|
141
|
+
} catch (e) {
|
|
142
|
+
console.warn("Failed to decode user volume accumulator", e);
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
124
147
|
async fetchGlobal(): Promise<Global> {
|
|
125
148
|
return await this.pumpProgram.account.global.fetch(globalPda());
|
|
126
149
|
}
|