Skip to content

Commit 05eb8ee

Browse files
authored
update to arkd v0.7.0 + arkd setup on startup (#225)
1 parent 27bf34c commit 05eb8ee

File tree

3 files changed

+179
-17
lines changed

3 files changed

+179
-17
lines changed

cmd/nigiri/faucet.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"errors"
77
"fmt"
88
"io/ioutil"
9+
"math"
910
"net/http"
1011
"os/exec"
1112
"path/filepath"
@@ -24,6 +25,7 @@ var faucet = cli.Command{
2425
Action: faucetAction,
2526
Flags: []cli.Flag{
2627
&liquidFlag,
28+
&arkFlag,
2729
},
2830
}
2931

@@ -59,6 +61,19 @@ func faucetAction(ctx *cli.Context) error {
5961
return err
6062
}
6163

64+
isArk := ctx.Bool("ark")
65+
if isArk {
66+
amount := 1.0
67+
if ctx.Args().Len() >= 2 {
68+
amount, err = strconv.ParseFloat(ctx.Args().Get(1), 64)
69+
if err != nil {
70+
return fmt.Errorf("invalid amount: %v", err)
71+
}
72+
}
73+
74+
return faucetArk(ctx.Args().First(), amount)
75+
}
76+
6277
address := ctx.Args().First()
6378
if address == "cln" {
6479
jsonOut, err := outputCommand("docker", "exec", "cln", "lightning-cli", "--network="+network, "newaddr")
@@ -146,3 +161,65 @@ func outputCommand(name string, arg ...string) ([]byte, error) {
146161
}
147162
return b, nil
148163
}
164+
165+
func faucetArk(address string, amount float64) error {
166+
amount = math.Round(amount * 100000000) // convert to satoshis
167+
bashCmd := exec.Command("docker", "exec", "-t", "ark", "ark", "balance")
168+
output, err := bashCmd.Output()
169+
if err != nil {
170+
return fmt.Errorf("failed to get balance: %w", err)
171+
}
172+
173+
// Parse the JSON response to extract offchain balance
174+
var balanceData map[string]interface{}
175+
if err := json.Unmarshal(output, &balanceData); err != nil {
176+
return fmt.Errorf("failed to parse balance JSON: %w", err)
177+
}
178+
179+
// Extract offchain balance
180+
offchainBalance, ok := balanceData["offchain_balance"].(map[string]interface{})
181+
if !ok {
182+
return fmt.Errorf("failed to get offchain_balance from response")
183+
}
184+
185+
total, ok := offchainBalance["total"].(float64)
186+
if !ok {
187+
return fmt.Errorf("failed to get total from offchain_balance")
188+
}
189+
190+
if total < amount {
191+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "arkd", "wallet", "address")
192+
output, err := bashCmd.Output()
193+
if err != nil {
194+
return fmt.Errorf("failed to get wallet address: %w", err)
195+
}
196+
address := strings.TrimSpace(string(output))
197+
198+
// Fund the address using nigiri faucet
199+
bashCmd = exec.Command("nigiri", "faucet", address)
200+
if err := bashCmd.Run(); err != nil {
201+
return fmt.Errorf("failed to fund wallet address: %w", err)
202+
}
203+
204+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "arkd", "note", "--amount", fmt.Sprintf("%d", int64(amount)))
205+
output, err = bashCmd.Output()
206+
if err != nil {
207+
return fmt.Errorf("failed to create arkd note: %w", err)
208+
}
209+
noteStr := strings.TrimSpace(string(output))
210+
211+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "ark", "redeem-notes", "-n", noteStr, "--password", "secret")
212+
if err := bashCmd.Run(); err != nil {
213+
return fmt.Errorf("failed to redeem note: %w", err)
214+
}
215+
}
216+
217+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "ark", "send", "--to", address, "--amount", fmt.Sprintf("%d", int64(amount)), "--password", "secret")
218+
output, err = bashCmd.Output()
219+
if err != nil {
220+
return fmt.Errorf("failed to send ark: %w", err)
221+
}
222+
fmt.Println(string(output))
223+
224+
return nil
225+
}

cmd/nigiri/resources/docker-compose.yml

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -234,29 +234,45 @@ services:
234234
- ./volumes/lightningd:/.lightning
235235
- ./volumes/bitcoin:/etc/bitcoin
236236

237+
ark-wallet:
238+
container_name: ark-wallet
239+
image: ghcr.io/arkade-os/arkd-wallet:v0.7.0
240+
depends_on:
241+
- bitcoin
242+
environment:
243+
ARKD_WALLET_LOG_LEVEL: "5"
244+
ARKD_WALLET_BITCOIND_RPC_USER: admin1
245+
ARKD_WALLET_BITCOIND_RPC_PASS: 123
246+
ARKD_WALLET_BITCOIND_RPC_HOST: bitcoin:18443
247+
ARKD_WALLET_DATADIR: "./data/regtest"
248+
ARKD_WALLET_NETWORK: "regtest"
249+
volumes:
250+
- ./volumes/ark/wallet:/app/data
251+
ports:
252+
- "6060:6060"
253+
237254
ark:
238255
container_name: ark
239-
image: ghcr.io/arkade-os/ark:v0.6.2
240-
user: "${UID:-1000}:${GID:-1000}"
256+
image: ghcr.io/arkade-os/arkd:v0.7.0
241257
depends_on:
242258
- bitcoin
259+
- ark-wallet
243260
environment:
244-
ARK_ROUND_INTERVAL: "15"
245-
ARK_LOG_LEVEL: "5"
246-
ARK_NETWORK: "regtest"
247-
ARK_PORT: "7070"
248-
ARK_NO_TLS: "true"
249-
ARK_NO_MACAROONS: "true"
250-
ARK_TX_BUILDER_TYPE: "covenantless"
251-
ARK_BITCOIND_RPC_USER: "admin1"
252-
ARK_BITCOIND_RPC_PASS: "123"
253-
ARK_BITCOIND_RPC_HOST: "bitcoin:18443"
254-
ARK_BITCOIND_ZMQ_BLOCK: "tcp://bitcoin:28332"
255-
ARK_BITCOIND_ZMQ_TX: "tcp://bitcoin:28333"
256-
ARK_DATADIR: "/app/data"
261+
ARKD_LOG_LEVEL: "5"
262+
ARKD_NO_MACAROONS: "true"
263+
ARKD_VTXO_TREE_EXPIRY: "100" # blocks
264+
ARKD_SCHEDULER_TYPE: "block"
265+
ARKD_UNILATERAL_EXIT_DELAY: "512"
266+
ARKD_BOARDING_EXIT_DELAY: "1024"
267+
ARKD_DATADIR: "./data/regtest"
268+
ARKD_WALLET_ADDR: "ark-wallet:6060"
269+
ARKD_ESPLORA_URL: "http://chopsticks:3000"
270+
ARKD_VTXO_MIN_AMOUNT: "1"
271+
ARKD_LIVE_STORE_TYPE: "inmemory"
272+
ARKD_EVENT_DB_TYPE: "badger"
273+
ARKD_DB_TYPE: "sqlite"
257274
volumes:
258275
- ./volumes/ark/data:/app/data
259-
- ./volumes/ark/wallet:/app/wallet-data
260276
ports:
261277
- "7070:7070"
262278
restart: unless-stopped

cmd/nigiri/start.go

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import (
55
"errors"
66
"fmt"
77
"os"
8+
"os/exec"
89
"path/filepath"
910
"strconv"
1011
"strings"
12+
"time"
1113

1214
"github.com/logrusorgru/aurora"
1315
"github.com/urfave/cli/v2"
@@ -141,7 +143,7 @@ func startAction(ctx *cli.Context) error {
141143
}
142144

143145
if effectiveFlags.Ark {
144-
services = append(services, "ark")
146+
services = append(services, "ark", "ark-wallet")
145147
}
146148

147149
bashCmd := runDockerCompose(composePath, append([]string{"up", "-d"}, services...)...)
@@ -195,5 +197,72 @@ func startAction(ctx *cli.Context) error {
195197
)
196198
}
197199

200+
if effectiveFlags.Ark {
201+
done := make(chan bool)
202+
go spinner(done, "setting up arkd...")
203+
204+
time.Sleep(4 * time.Second) // give time for the container to start
205+
if err := setupArk(); err != nil {
206+
return fmt.Errorf("failed to setup Ark: %w", err)
207+
}
208+
209+
done <- true
210+
fmt.Println("✓ arkd setup completed successfully!")
211+
}
212+
213+
return nil
214+
}
215+
216+
func spinner(done chan bool, message string) {
217+
frames := []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"}
218+
i := 0
219+
for {
220+
select {
221+
case <-done:
222+
fmt.Printf("\r%s\r", strings.Repeat(" ", len(message)+3))
223+
return
224+
default:
225+
fmt.Printf("\r%s %s", frames[i], message)
226+
time.Sleep(100 * time.Millisecond)
227+
i = (i + 1) % len(frames)
228+
}
229+
}
230+
}
231+
232+
func setupArk() error {
233+
bashCmd := exec.Command("docker", "exec", "-t", "ark", "arkd", "wallet", "create", "--password", "secret")
234+
bashCmd.Run()
235+
236+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "arkd", "wallet", "unlock", "--password", "secret")
237+
if err := bashCmd.Run(); err != nil {
238+
return fmt.Errorf("failed to unlock wallet: %w", err)
239+
}
240+
241+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "arkd", "wallet", "status")
242+
if err := bashCmd.Run(); err != nil {
243+
return fmt.Errorf("failed to check wallet status: %w", err)
244+
}
245+
246+
time.Sleep(10 * time.Second)
247+
248+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "ark", "init", "--network", "regtest", "--password", "secret", "--server-url", "localhost:7070", "--explorer", "http://chopsticks:3000")
249+
bashCmd.Run() // Ignore error as wallet might already exist
250+
251+
// faucet arkd wallet
252+
bashCmd = exec.Command("docker", "exec", "-t", "ark", "arkd", "wallet", "address")
253+
output, err := bashCmd.Output()
254+
if err != nil {
255+
return fmt.Errorf("failed to get wallet address: %w", err)
256+
}
257+
address := strings.TrimSpace(string(output))
258+
259+
// Fund the address using nigiri faucet
260+
for i := 0; i < 10; i++ {
261+
bashCmd = exec.Command("nigiri", "faucet", address)
262+
if err := bashCmd.Run(); err != nil {
263+
return fmt.Errorf("failed to fund wallet address: %w", err)
264+
}
265+
}
266+
198267
return nil
199268
}

0 commit comments

Comments
 (0)