Skip to content

Commit 24f9acb

Browse files
committed
Update to latest currency creator program spec
1 parent 11b3d24 commit 24f9acb

11 files changed

+165
-293
lines changed

pkg/solana/currencycreator/accounts_currency_config.go

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,25 @@ const (
2121
const (
2222
CurrencyConfigAccountSize = (8 + //discriminator
2323
32 + // authority
24-
32 + // creator
2524
32 + // mint
2625
MaxCurrencyConfigAccountNameLength + // name
2726
MaxCurrencyConfigAccountSymbolLength + // symbol
2827
32 + // seed
29-
8 + // max_supply
30-
8 + // current_supply
31-
1 + // decimal_places
3228
1 + // bump
3329
1 + // mint_bump
34-
5) // padding
30+
6) // padding
3531
)
3632

3733
var CurrencyConfigAccountDiscriminator = []byte{byte(AccountTypeCurrencyConfig), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
3834

3935
type CurrencyConfigAccount struct {
40-
Authority ed25519.PublicKey
41-
Creator ed25519.PublicKey
42-
Mint ed25519.PublicKey
43-
Name string
44-
Symbol string
45-
Seed ed25519.PublicKey
46-
MaxSupply uint64
47-
CurrentSupply uint64
48-
DecimalPlaces uint8
49-
Bump uint8
50-
MintBump uint8
36+
Authority ed25519.PublicKey
37+
Mint ed25519.PublicKey
38+
Name string
39+
Symbol string
40+
Seed ed25519.PublicKey
41+
Bump uint8
42+
MintBump uint8
5143
}
5244

5345
func (obj *CurrencyConfigAccount) Unmarshal(data []byte) error {
@@ -64,33 +56,25 @@ func (obj *CurrencyConfigAccount) Unmarshal(data []byte) error {
6456
}
6557

6658
getKey(data, &obj.Authority, &offset)
67-
getKey(data, &obj.Creator, &offset)
6859
getKey(data, &obj.Mint, &offset)
6960
getFixedString(data, &obj.Name, MaxCurrencyConfigAccountNameLength, &offset)
7061
getFixedString(data, &obj.Symbol, MaxCurrencyConfigAccountSymbolLength, &offset)
7162
getKey(data, &obj.Seed, &offset)
72-
getUint64(data, &obj.MaxSupply, &offset)
73-
getUint64(data, &obj.CurrentSupply, &offset)
74-
getUint8(data, &obj.DecimalPlaces, &offset)
7563
getUint8(data, &obj.Bump, &offset)
7664
getUint8(data, &obj.MintBump, &offset)
77-
offset += 5 // padding
65+
offset += 6 // padding
7866

7967
return nil
8068
}
8169

8270
func (obj *CurrencyConfigAccount) String() string {
8371
return fmt.Sprintf(
84-
"CurrencyConfig{authority=%s,creator=%s,mint=%s,name=%s,symbol=%s,seed=%s,max_supply=%d,currency_supply=%d,decimal_places=%d,bump=%d,mint_bump=%d}",
72+
"CurrencyConfig{authority=%s,mint=%s,name=%s,symbol=%s,seed=%s,bump=%d,mint_bump=%d}",
8573
base58.Encode(obj.Authority),
86-
base58.Encode(obj.Creator),
8774
base58.Encode(obj.Mint),
8875
obj.Name,
8976
obj.Symbol,
9077
base58.Encode(obj.Seed),
91-
obj.MaxSupply,
92-
obj.CurrentSupply,
93-
obj.DecimalPlaces,
9478
obj.Bump,
9579
obj.MintBump,
9680
)

pkg/solana/currencycreator/accounts_liquidity_pool.go

Lines changed: 22 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,11 @@ import (
44
"bytes"
55
"crypto/ed25519"
66
"fmt"
7-
"time"
87

98
"github.com/mr-tron/base58"
109
)
1110

1211
const (
13-
DefaultBuyCap = 0 // unlimited base tokens
14-
DefaultSaleCap = 0 // unlimited target tokens
15-
1612
DefaultBuyFeeBps = 0 // 0% fee
1713
DefaultSellFeeBps = 100 // 1% fee
1814
)
@@ -27,44 +23,30 @@ const (
2723
32 + // vault_base
2824
32 + // fee_target
2925
32 + // fee_base
30-
4 + // buy_fee
31-
4 + // sell_fee
32-
8 + // created_unix_time
33-
8 + // go_live_unix_time
34-
8 + // purchase_cap
35-
8 + // sale_cap
36-
RawExponentialCurveSize + // curve
37-
8 + // supply_from_baseonding
26+
2 + // buy_fee
27+
2 + // sell_fee
3828
1 + // bump
39-
1 + // currency_baseump
40-
1 + // vault_target_baseump
41-
1 + // vault_base_baseump
42-
4) // padding
29+
1 + // vault_target_bump
30+
1 + // vault_base_bump
31+
1) // padding
4332
)
4433

4534
var LiquidityPoolAccountDiscriminator = []byte{byte(AccountTypeLiquidityPool), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
4635

4736
type LiquidityPoolAccount struct {
48-
Authority ed25519.PublicKey
49-
Currency ed25519.PublicKey
50-
TargetMint ed25519.PublicKey
51-
BaseMint ed25519.PublicKey
52-
VaultTarget ed25519.PublicKey
53-
VaultBase ed25519.PublicKey
54-
FeeTarget ed25519.PublicKey
55-
FeeBase ed25519.PublicKey
56-
BuyFee uint32
57-
SellFee uint32
58-
CreatedUnixTime int64
59-
GoLiveUnixTime int64
60-
PurchaseCap uint64
61-
SaleCap uint64
62-
Curve RawExponentialCurve
63-
SupplyFromBonding uint64
64-
Bump uint8
65-
CurrencyBump uint8
66-
VaultTargetBump uint8
67-
VaultBaseBump uint8
37+
Authority ed25519.PublicKey
38+
Currency ed25519.PublicKey
39+
TargetMint ed25519.PublicKey
40+
BaseMint ed25519.PublicKey
41+
VaultTarget ed25519.PublicKey
42+
VaultBase ed25519.PublicKey
43+
FeeTarget ed25519.PublicKey
44+
FeeBase ed25519.PublicKey
45+
BuyFee uint16
46+
SellFee uint16
47+
Bump uint8
48+
VaultTargetBump uint8
49+
VaultBaseBump uint8
6850
}
6951

7052
func (obj *LiquidityPoolAccount) Unmarshal(data []byte) error {
@@ -88,26 +70,19 @@ func (obj *LiquidityPoolAccount) Unmarshal(data []byte) error {
8870
getKey(data, &obj.VaultBase, &offset)
8971
getKey(data, &obj.FeeTarget, &offset)
9072
getKey(data, &obj.FeeBase, &offset)
91-
getUint32(data, &obj.BuyFee, &offset)
92-
getUint32(data, &obj.SellFee, &offset)
93-
getInt64(data, &obj.CreatedUnixTime, &offset)
94-
getInt64(data, &obj.GoLiveUnixTime, &offset)
95-
getUint64(data, &obj.PurchaseCap, &offset)
96-
getUint64(data, &obj.SaleCap, &offset)
97-
getRawExponentialCurve(data, &obj.Curve, &offset)
98-
getUint64(data, &obj.SupplyFromBonding, &offset)
73+
getUint16(data, &obj.BuyFee, &offset)
74+
getUint16(data, &obj.SellFee, &offset)
9975
getUint8(data, &obj.Bump, &offset)
100-
getUint8(data, &obj.CurrencyBump, &offset)
10176
getUint8(data, &obj.VaultTargetBump, &offset)
10277
getUint8(data, &obj.VaultBaseBump, &offset)
103-
offset += 4 // padding
78+
offset += 1 // padding
10479

10580
return nil
10681
}
10782

10883
func (obj *LiquidityPoolAccount) String() string {
10984
return fmt.Sprintf(
110-
"LiquidityPool{authority=%s,currency=%s,target_mint=%s,base_mint=%s,vault_target=%s,vault_base=%s,fee_target=%s,fee_base=%s,buy_fee=%d,sell_fee=%d,created_unix_time=%s,go_live_unix_time=%s,purchase_cap=%d,sale_cap=%d,curve=%s,bump=%d,currency_bump=%d,vault_target_bump=%d,vault_base_bump=%d}",
85+
"LiquidityPool{authority=%s,currency=%s,target_mint=%s,base_mint=%s,vault_target=%s,vault_base=%s,fee_target=%s,fee_base=%s,buy_fee=%d,sell_fee=%d,bump=%d,vault_target_bump=%d,vault_base_bump=%d}",
11186
base58.Encode(obj.Authority),
11287
base58.Encode(obj.Currency),
11388
base58.Encode(obj.TargetMint),
@@ -118,13 +93,7 @@ func (obj *LiquidityPoolAccount) String() string {
11893
base58.Encode(obj.FeeBase),
11994
obj.BuyFee,
12095
obj.SellFee,
121-
time.Unix(obj.CreatedUnixTime, 0).UTC().String(),
122-
time.Unix(obj.GoLiveUnixTime, 0).UTC().String(),
123-
obj.PurchaseCap,
124-
obj.SaleCap,
125-
obj.Curve.String(),
12696
obj.Bump,
127-
obj.CurrencyBump,
12897
obj.VaultTargetBump,
12998
obj.VaultBaseBump,
13099
)

pkg/solana/currencycreator/estimate.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ type EstimateCurrentPriceArgs struct {
1212
}
1313

1414
func EstimateCurrentPrice(args *EstimateCurrentPriceArgs) *big.Float {
15-
scale := big.NewFloat(math.Pow10(int(args.MintDecimals))).SetPrec(defaultExponentialCurvePrec)
16-
unscaledCurrentSupply := big.NewFloat(float64(args.CurrentSupplyInQuarks)).SetPrec(defaultExponentialCurvePrec)
15+
scale := big.NewFloat(math.Pow10(int(args.MintDecimals))).SetPrec(defaultCurvePrec)
16+
unscaledCurrentSupply := big.NewFloat(float64(args.CurrentSupplyInQuarks)).SetPrec(defaultCurvePrec)
1717
scaledCurrentSupply := new(big.Float).Quo(unscaledCurrentSupply, scale)
1818
return args.Curve.SpotPriceAtSupply(scaledCurrentSupply)
1919
}
@@ -22,25 +22,25 @@ type EstimateBuyArgs struct {
2222
BuyAmountInQuarks uint64
2323
Curve *ExponentialCurve
2424
CurrentSupplyInQuarks uint64
25-
BuyFeeBps uint32
25+
BuyFeeBps uint16
2626
TargetMintDecimals uint8
2727
BaseMintDecimals uint8
2828
}
2929

3030
func EstimateBuy(args *EstimateBuyArgs) (uint64, uint64) {
31-
scale := big.NewFloat(math.Pow10(int(args.BaseMintDecimals))).SetPrec(defaultExponentialCurvePrec)
32-
unscaledBuyAmount := big.NewFloat(float64(args.BuyAmountInQuarks)).SetPrec(defaultExponentialCurvePrec)
31+
scale := big.NewFloat(math.Pow10(int(args.BaseMintDecimals))).SetPrec(defaultCurvePrec)
32+
unscaledBuyAmount := big.NewFloat(float64(args.BuyAmountInQuarks)).SetPrec(defaultCurvePrec)
3333
scaledBuyAmount := new(big.Float).Quo(unscaledBuyAmount, scale)
3434

35-
scale = big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultExponentialCurvePrec)
36-
unscaledCurrentSupply := big.NewFloat(float64(args.CurrentSupplyInQuarks)).SetPrec(defaultExponentialCurvePrec)
35+
scale = big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultCurvePrec)
36+
unscaledCurrentSupply := big.NewFloat(float64(args.CurrentSupplyInQuarks)).SetPrec(defaultCurvePrec)
3737
scaledCurrentSupply := new(big.Float).Quo(unscaledCurrentSupply, scale)
3838

39-
scale = big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultExponentialCurvePrec)
39+
scale = big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultCurvePrec)
4040
scaledTotalValue := args.Curve.ValueToTokens(scaledCurrentSupply, scaledBuyAmount)
4141
unscaledTotalValue := new(big.Float).Mul(scaledTotalValue, scale)
4242

43-
feePctValue := new(big.Float).SetPrec(defaultExponentialCurvePrec).Quo(big.NewFloat(float64(args.BuyFeeBps)), big.NewFloat(10000))
43+
feePctValue := new(big.Float).SetPrec(defaultCurvePrec).Quo(big.NewFloat(float64(args.BuyFeeBps)), big.NewFloat(10000))
4444
scaledFees := new(big.Float).Mul(scaledTotalValue, feePctValue)
4545
unscaledFees := new(big.Float).Mul(scaledFees, scale)
4646

@@ -53,25 +53,25 @@ type EstimateSaleArgs struct {
5353
SellAmountInQuarks uint64
5454
Curve *ExponentialCurve
5555
CurrentSupplyInQuarks uint64
56-
SellFeeBps uint32
56+
SellFeeBps uint16
5757
TargetMintDecimals uint8
5858
BaseMintDecimals uint8
5959
}
6060

6161
func EstimateSale(args *EstimateSaleArgs) (uint64, uint64) {
62-
scale := big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultExponentialCurvePrec)
63-
unscaledSellAmount := big.NewFloat(float64(args.SellAmountInQuarks)).SetPrec(defaultExponentialCurvePrec)
62+
scale := big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultCurvePrec)
63+
unscaledSellAmount := big.NewFloat(float64(args.SellAmountInQuarks)).SetPrec(defaultCurvePrec)
6464
scaledSellAmount := new(big.Float).Quo(unscaledSellAmount, scale)
6565

66-
scale = big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultExponentialCurvePrec)
67-
unscaledCurrentSupply := big.NewFloat(float64(args.CurrentSupplyInQuarks)).SetPrec(defaultExponentialCurvePrec)
66+
scale = big.NewFloat(math.Pow10(int(args.TargetMintDecimals))).SetPrec(defaultCurvePrec)
67+
unscaledCurrentSupply := big.NewFloat(float64(args.CurrentSupplyInQuarks)).SetPrec(defaultCurvePrec)
6868
scaledCurrentSupply := new(big.Float).Quo(unscaledCurrentSupply, scale)
6969

70-
scale = big.NewFloat(math.Pow10(int(args.BaseMintDecimals))).SetPrec(defaultExponentialCurvePrec)
70+
scale = big.NewFloat(math.Pow10(int(args.BaseMintDecimals))).SetPrec(defaultCurvePrec)
7171
scaledTotalValue := args.Curve.TokensToValue(scaledCurrentSupply, scaledSellAmount)
7272
unscaledTotalValue := new(big.Float).Mul(scaledTotalValue, scale)
7373

74-
feePctValue := new(big.Float).SetPrec(defaultExponentialCurvePrec).Quo(big.NewFloat(float64(args.SellFeeBps)), big.NewFloat(10000))
74+
feePctValue := new(big.Float).SetPrec(defaultCurvePrec).Quo(big.NewFloat(float64(args.SellFeeBps)), big.NewFloat(10000))
7575
scaledFees := new(big.Float).Mul(scaledTotalValue, feePctValue)
7676
unscaledFees := new(big.Float).Mul(scaledFees, scale)
7777

pkg/solana/currencycreator/exponential_curve.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,15 @@ import (
77

88
// Note: Generated with Grok 4 based on curve.rs, and not 100% accurate with on-chain program
99

10-
const defaultExponentialCurvePrec = 128
10+
const (
11+
DefaultCurveDecimals = 18
12+
13+
DefaultCurveAString = "11400230149967394933471" // 11400.230149967394933471
14+
DefaultCurveBString = "877175273521" // 0.000000877175273521
15+
DefaultCurveScaleString = "1000000000000000000" // 10^18
16+
17+
defaultCurvePrec = 128
18+
)
1119

1220
type ExponentialCurve struct {
1321
a *big.Float
@@ -42,16 +50,16 @@ func (curve *ExponentialCurve) ValueToTokens(currentSupply, value *big.Float) *b
4250
}
4351

4452
func DefaultExponentialCurve() *ExponentialCurve {
45-
scale, ok := new(big.Float).SetPrec(defaultExponentialCurvePrec).SetString(defaultCurveScaleString)
53+
scale, ok := new(big.Float).SetPrec(defaultCurvePrec).SetString(DefaultCurveScaleString)
4654
if !ok {
4755
panic("Invalid scale string")
4856
}
4957

50-
aInt, _ := new(big.Int).SetString(defaultCurveAString, 10)
51-
bInt, _ := new(big.Int).SetString(defaultCurveBString, 10)
58+
aInt, _ := new(big.Int).SetString(DefaultCurveAString, 10)
59+
bInt, _ := new(big.Int).SetString(DefaultCurveBString, 10)
5260

53-
a := new(big.Float).Quo(new(big.Float).SetPrec(defaultExponentialCurvePrec).SetInt(aInt), scale)
54-
b := new(big.Float).Quo(new(big.Float).SetPrec(defaultExponentialCurvePrec).SetInt(bInt), scale)
61+
a := new(big.Float).Quo(new(big.Float).SetPrec(defaultCurvePrec).SetInt(aInt), scale)
62+
b := new(big.Float).Quo(new(big.Float).SetPrec(defaultCurvePrec).SetInt(bInt), scale)
5563
c := new(big.Float).Copy(b)
5664

5765
return &ExponentialCurve{a: a, b: b, c: c}

pkg/solana/currencycreator/exponential_curve_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func TestCalculateCurveConstants(t *testing.T) {
1515
diff := new(big.Float).Sub(spot0, expectedStart)
1616
threshold, _ := new(big.Float).SetString("0.0000000001")
1717
if diff.Abs(diff).Cmp(threshold) > 0 {
18-
t.Errorf("Spot at 0: got %s, expected 0.01", spot0.Text('f', RawExponentialCurveDecimals))
18+
t.Errorf("Spot at 0: got %s, expected 0.01", spot0.Text('f', DefaultCurveDecimals))
1919
}
2020

2121
// Check R'(21000000) with tolerance
@@ -25,7 +25,7 @@ func TestCalculateCurveConstants(t *testing.T) {
2525
diff = new(big.Float).Sub(spotEnd, expectedEnd)
2626
threshold, _ = new(big.Float).SetString("0.0001")
2727
if diff.Abs(diff).Cmp(threshold) > 0 {
28-
t.Errorf("Spot at end: got %s, expected 1000000", spotEnd.Text('f', RawExponentialCurveDecimals))
28+
t.Errorf("Spot at end: got %s, expected 1000000", spotEnd.Text('f', DefaultCurveDecimals))
2929
}
3030
}
3131

@@ -49,8 +49,8 @@ func TestGenerateCurveTable(t *testing.T) {
4949
fmt.Printf("| %3d%% | %14s | %32s | %26s |\n",
5050
i,
5151
supply.Text('f', 0),
52-
cost.Text('f', RawExponentialCurveDecimals),
53-
spotPrice.Text('f', RawExponentialCurveDecimals))
52+
cost.Text('f', DefaultCurveDecimals),
53+
spotPrice.Text('f', DefaultCurveDecimals))
5454

5555
supply = supply.Add(supply, buyAmount)
5656
}

0 commit comments

Comments
 (0)