Repository navigation
Expand file tree
/
Copy pathconstruct.go
More file actions
91 lines (80 loc) · 2.2 KB
/
Copy pathconstruct.go
File metadata and controls
91 lines (80 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package paywall
import (
"crypto/rand"
"time"
"github.com/opd-ai/paywall/wallet"
)
// ConstructPaywall creates and initializes a new Paywall instance.
// Unlike "NewPaywall" ConstructPaywall automatically configures a
// persistent wallet with a file backed store.
// Parameters:
// - config: Configuration options for the paywall
//
// Returns:
// - *Paywall: Initialized paywall instance
// - error: If initialization fails
//
// Errors:
// - If random seed generation fails
// - If HD wallet creation fails
// - If template parsing fails
//
// Related types: Config, Paywall
func ConstructPaywall(base string) (*Paywall, error) {
key, err := wallet.GenerateEncryptionKey()
if err != nil {
return nil, err
}
if base == "" {
base = "./paywallet"
}
storageConfig := wallet.StorageConfig{
DataDir: base,
EncryptionKey: key,
}
fileStore := NewFileStore(storageConfig.DataDir)
// Initialize paywall with minimal config
pw, err := NewPaywall(Config{
PriceInBTC: 0.0001, // 0.0001 BTC
TestNet: false, // don't use testnet
Store: fileStore, // Required for payment tracking
PaymentTimeout: time.Hour * 2,
MinConfirmations: 1,
})
if err != nil {
return nil, err
}
// Initialize wallet map
pw.HDWallets = make(map[wallet.WalletType]wallet.HDWallet)
// Try to load existing wallet or create new one
var btcWallet wallet.HDWallet
if loadedWallet, err := wallet.LoadFromFile(storageConfig); err != nil {
// Create new wallet if loading fails
// securely generate a random 64-byte seed using crypto/rand
seed, err := secureRandomSeed()
if err != nil {
return nil, err
}
btcWallet, err = wallet.NewBTCHDWallet(seed, false, pw.minConfirmations)
if err != nil {
return nil, err
}
// Save the newly generated wallet
if err := btcWallet.(*wallet.BTCHDWallet).SaveToFile(storageConfig); err != nil {
return nil, err
}
} else {
btcWallet = loadedWallet
}
// Assign wallet to paywall
pw.HDWallets[wallet.Bitcoin] = btcWallet
return pw, nil
}
func secureRandomSeed() ([]byte, error) {
seed := make([]byte, 64) // 64 bytes for a secure seed
_, err := rand.Read(seed)
if err != nil {
return nil, err
}
return seed, nil
}