Skip to content

Commit 0118611

Browse files
X-Chain - repackaged wallet backends (#2762)
Co-authored-by: Stephen Buttolph <stephen@avalabs.org>
1 parent 9cef7d3 commit 0118611

File tree

25 files changed

+331
-309
lines changed

25 files changed

+331
-309
lines changed

indexer/examples/x-chain-blocks/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
"github.com/ava-labs/avalanchego/indexer"
1212
"github.com/ava-labs/avalanchego/vms/proposervm/block"
13-
"github.com/ava-labs/avalanchego/wallet/chain/x"
13+
"github.com/ava-labs/avalanchego/wallet/chain/x/builder"
1414
"github.com/ava-labs/avalanchego/wallet/subnet/primary"
1515
)
1616

@@ -37,7 +37,7 @@ func main() {
3737
}
3838

3939
avmBlockBytes := proposerVMBlock.Block()
40-
avmBlock, err := x.Parser.ParseBlock(avmBlockBytes)
40+
avmBlock, err := builder.Parser.ParseBlock(avmBlockBytes)
4141
if err != nil {
4242
log.Fatalf("failed to parse avm block: %s\n", err)
4343
}

tests/antithesis/main.go

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ import (
2727
"github.com/ava-labs/avalanchego/vms/platformvm/status"
2828
"github.com/ava-labs/avalanchego/vms/propertyfx"
2929
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
30-
"github.com/ava-labs/avalanchego/wallet/chain/x"
3130
"github.com/ava-labs/avalanchego/wallet/subnet/primary"
3231
"github.com/ava-labs/avalanchego/wallet/subnet/primary/common"
3332

3433
xtxs "github.com/ava-labs/avalanchego/vms/avm/txs"
3534
ptxs "github.com/ava-labs/avalanchego/vms/platformvm/txs"
35+
xbuilder "github.com/ava-labs/avalanchego/wallet/chain/x/builder"
3636
)
3737

3838
const NumKeys = 5
@@ -69,8 +69,10 @@ func main() {
6969
workloads[0] = genesisWorkload
7070

7171
var (
72-
genesisXWallet = wallet.X()
73-
avaxAssetID = genesisXWallet.AVAXAssetID()
72+
genesisXWallet = wallet.X()
73+
genesisXBuilder = genesisXWallet.Builder()
74+
genesisXContext = genesisXBuilder.Context()
75+
avaxAssetID = genesisXContext.AVAXAssetID
7476
)
7577
for i := 1; i < NumKeys; i++ {
7678
key, err := secp256k1.NewPrivateKey()
@@ -192,7 +194,8 @@ func (w *workload) run(ctx context.Context) {
192194
log.Fatalf("failed to fetch P-chain balances: %s", err)
193195
}
194196
var (
195-
avaxAssetID = xWallet.AVAXAssetID()
197+
xContext = xBuilder.Context()
198+
avaxAssetID = xContext.AVAXAssetID
196199
xAVAX = xBalances[avaxAssetID]
197200
pAVAX = pBalances[avaxAssetID]
198201
)
@@ -245,9 +248,10 @@ func (w *workload) issueXChainBaseTx(ctx context.Context) {
245248
}
246249

247250
var (
248-
avaxAssetID = xWallet.AVAXAssetID()
251+
xContext = xBuilder.Context()
252+
avaxAssetID = xContext.AVAXAssetID
249253
avaxBalance = balances[avaxAssetID]
250-
baseTxFee = xWallet.BaseTxFee()
254+
baseTxFee = xContext.BaseTxFee
251255
neededBalance = baseTxFee + units.Schmeckle
252256
)
253257
if avaxBalance < neededBalance {
@@ -294,9 +298,10 @@ func (w *workload) issueXChainCreateAssetTx(ctx context.Context) {
294298
}
295299

296300
var (
297-
avaxAssetID = xWallet.AVAXAssetID()
301+
xContext = xBuilder.Context()
302+
avaxAssetID = xContext.AVAXAssetID
298303
avaxBalance = balances[avaxAssetID]
299-
neededBalance = xWallet.CreateAssetTxFee()
304+
neededBalance = xContext.CreateAssetTxFee
300305
)
301306
if avaxBalance < neededBalance {
302307
log.Printf("skipping X-chain tx issuance due to insufficient balance: %d < %d", avaxBalance, neededBalance)
@@ -342,10 +347,11 @@ func (w *workload) issueXChainOperationTx(ctx context.Context) {
342347
}
343348

344349
var (
345-
avaxAssetID = xWallet.AVAXAssetID()
350+
xContext = xBuilder.Context()
351+
avaxAssetID = xContext.AVAXAssetID
346352
avaxBalance = balances[avaxAssetID]
347-
createAssetTxFee = xWallet.CreateAssetTxFee()
348-
baseTxFee = xWallet.BaseTxFee()
353+
createAssetTxFee = xContext.CreateAssetTxFee
354+
baseTxFee = xContext.BaseTxFee
349355
neededBalance = createAssetTxFee + baseTxFee
350356
)
351357
if avaxBalance < neededBalance {
@@ -405,9 +411,10 @@ func (w *workload) issueXToPTransfer(ctx context.Context) {
405411
}
406412

407413
var (
408-
avaxAssetID = xWallet.AVAXAssetID()
414+
xContext = xBuilder.Context()
415+
avaxAssetID = xContext.AVAXAssetID
409416
avaxBalance = balances[avaxAssetID]
410-
xBaseTxFee = xWallet.BaseTxFee()
417+
xBaseTxFee = xContext.BaseTxFee
411418
pBuilder = pWallet.Builder()
412419
pContext = pBuilder.Context()
413420
pBaseTxFee = pContext.BaseTxFee
@@ -441,7 +448,7 @@ func (w *workload) issueXToPTransfer(ctx context.Context) {
441448
log.Printf("created X-chain export transaction %s in %s", exportTx.ID(), time.Since(exportStartTime))
442449

443450
var (
444-
xChainID = xWallet.BlockchainID()
451+
xChainID = xContext.BlockchainID
445452
importStartTime = time.Now()
446453
)
447454
importTx, err := pWallet.IssueImportTx(
@@ -464,6 +471,7 @@ func (w *workload) issuePToXTransfer(ctx context.Context) {
464471
var (
465472
xWallet = w.wallet.X()
466473
pWallet = w.wallet.P()
474+
xBuilder = xWallet.Builder()
467475
pBuilder = pWallet.Builder()
468476
)
469477
balances, err := pBuilder.GetBalance()
@@ -473,11 +481,12 @@ func (w *workload) issuePToXTransfer(ctx context.Context) {
473481
}
474482

475483
var (
484+
xContext = xBuilder.Context()
476485
pContext = pBuilder.Context()
477486
avaxAssetID = pContext.AVAXAssetID
478487
avaxBalance = balances[avaxAssetID]
479488
pBaseTxFee = pContext.BaseTxFee
480-
xBaseTxFee = xWallet.BaseTxFee()
489+
xBaseTxFee = xContext.BaseTxFee
481490
txFees = pBaseTxFee + xBaseTxFee
482491
neededBalance = txFees + units.Schmeckle
483492
)
@@ -487,7 +496,7 @@ func (w *workload) issuePToXTransfer(ctx context.Context) {
487496
}
488497

489498
var (
490-
xChainID = xWallet.BlockchainID()
499+
xChainID = xContext.BlockchainID
491500
owner = w.makeOwner()
492501
exportStartTime = time.Now()
493502
)
@@ -573,7 +582,7 @@ func (w *workload) confirmPChainTx(ctx context.Context, tx *ptxs.Tx) {
573582

574583
func (w *workload) verifyXChainTxConsumedUTXOs(ctx context.Context, tx *xtxs.Tx) {
575584
txID := tx.ID()
576-
chainID := w.wallet.X().BlockchainID()
585+
chainID := w.wallet.X().Builder().Context().BlockchainID
577586
for _, uri := range w.uris {
578587
client := avm.NewClient(uri, "X")
579588

@@ -582,7 +591,7 @@ func (w *workload) verifyXChainTxConsumedUTXOs(ctx context.Context, tx *xtxs.Tx)
582591
ctx,
583592
utxos,
584593
client,
585-
x.Parser.Codec(),
594+
xbuilder.Parser.Codec(),
586595
chainID,
587596
chainID,
588597
w.addrs.List(),

tests/e2e/banff/suites.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ var _ = ginkgo.Describe("[Banff]", func() {
3030
// Get the P-chain and the X-chain wallets
3131
pWallet := wallet.P()
3232
xWallet := wallet.X()
33+
xBuilder := xWallet.Builder()
34+
xContext := xBuilder.Context()
3335

3436
// Pull out useful constants to use when issuing transactions.
35-
xChainID := xWallet.BlockchainID()
37+
xChainID := xContext.BlockchainID
3638
owner := &secp256k1fx.OutputOwners{
3739
Threshold: 1,
3840
Addrs: []ids.ShortID{

tests/e2e/c/interchain_workflow.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ var _ = e2e.DescribeCChain("[Interchain Workflow]", func() {
8484
pWallet := baseWallet.P()
8585

8686
ginkgo.By("defining common configuration")
87-
avaxAssetID := xWallet.AVAXAssetID()
87+
xBuilder := xWallet.Builder()
88+
xContext := xBuilder.Context()
89+
avaxAssetID := xContext.AVAXAssetID
8890
// Use the same owner for import funds to X-Chain and P-Chain
8991
recipientOwner := secp256k1fx.OutputOwners{
9092
Threshold: 1,
@@ -107,7 +109,7 @@ var _ = e2e.DescribeCChain("[Interchain Workflow]", func() {
107109

108110
ginkgo.By("exporting AVAX from the C-Chain to the X-Chain", func() {
109111
_, err := cWallet.IssueExportTx(
110-
xWallet.BlockchainID(),
112+
xContext.BlockchainID,
111113
exportOutputs,
112114
e2e.WithDefaultContext(),
113115
e2e.WithSuggestedGasPrice(ethClient),

tests/e2e/p/interchain_workflow.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,14 @@ var _ = e2e.DescribePChain("[Interchain Workflow]", ginkgo.Label(e2e.UsesCChainL
5656
cWallet := baseWallet.C()
5757
pWallet := baseWallet.P()
5858

59+
xBuilder := xWallet.Builder()
60+
xContext := xBuilder.Context()
5961
pBuilder := pWallet.Builder()
6062
pContext := pBuilder.Context()
6163

6264
ginkgo.By("defining common configuration")
6365
recipientEthAddress := evm.GetEthAddress(recipientKey)
64-
avaxAssetID := xWallet.AVAXAssetID()
66+
avaxAssetID := xContext.AVAXAssetID
6567
// Use the same owner for sending to X-Chain and importing funds to P-Chain
6668
recipientOwner := secp256k1fx.OutputOwners{
6769
Threshold: 1,
@@ -158,7 +160,7 @@ var _ = e2e.DescribePChain("[Interchain Workflow]", ginkgo.Label(e2e.UsesCChainL
158160

159161
ginkgo.By("exporting AVAX from the P-Chain to the X-Chain", func() {
160162
_, err := pWallet.IssueExportTx(
161-
xWallet.BlockchainID(),
163+
xContext.BlockchainID,
162164
exportOutputs,
163165
e2e.WithDefaultContext(),
164166
)

tests/e2e/p/permissionless_subnets.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ var _ = e2e.DescribePChain("[Permissionless Subnets]", func() {
3636

3737
pWallet := baseWallet.P()
3838
xWallet := baseWallet.X()
39-
xChainID := xWallet.BlockchainID()
39+
xBuilder := xWallet.Builder()
40+
xContext := xBuilder.Context()
41+
xChainID := xContext.BlockchainID
4042

4143
var validatorID ids.NodeID
4244
ginkgo.By("retrieving the node ID of a primary network validator", func() {

tests/e2e/p/workflow.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ var _ = e2e.DescribePChain("[Workflow]", func() {
4545
pContext := pBuilder.Context()
4646
avaxAssetID := pContext.AVAXAssetID
4747
xWallet := baseWallet.X()
48+
xBuilder := xWallet.Builder()
49+
xContext := xBuilder.Context()
4850
pChainClient := platformvm.NewClient(nodeURI.URI)
4951

5052
tests.Outf("{{blue}} fetching minimal stake amounts {{/}}\n")
@@ -143,7 +145,7 @@ var _ = e2e.DescribePChain("[Workflow]", func() {
143145

144146
ginkgo.By("export avax from P to X chain", func() {
145147
_, err := pWallet.IssueExportTx(
146-
xWallet.BlockchainID(),
148+
xContext.BlockchainID,
147149
[]*avax.TransferableOutput{
148150
{
149151
Asset: avax.Asset{

tests/e2e/x/interchain_workflow.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ var _ = e2e.DescribeXChain("[Interchain Workflow]", ginkgo.Label(e2e.UsesCChainL
4242

4343
ginkgo.By("defining common configuration")
4444
recipientEthAddress := evm.GetEthAddress(recipientKey)
45-
avaxAssetID := xWallet.AVAXAssetID()
45+
xBuilder := xWallet.Builder()
46+
xContext := xBuilder.Context()
47+
avaxAssetID := xContext.AVAXAssetID
4648
// Use the same owner for sending to X-Chain and importing funds to P-Chain
4749
recipientOwner := secp256k1fx.OutputOwners{
4850
Threshold: 1,
@@ -106,7 +108,7 @@ var _ = e2e.DescribeXChain("[Interchain Workflow]", ginkgo.Label(e2e.UsesCChainL
106108

107109
ginkgo.By("importing AVAX from the X-Chain to the C-Chain", func() {
108110
_, err := cWallet.IssueImportTx(
109-
xWallet.BlockchainID(),
111+
xContext.BlockchainID,
110112
recipientEthAddress,
111113
e2e.WithDefaultContext(),
112114
e2e.WithSuggestedGasPrice(ethClient),
@@ -132,7 +134,7 @@ var _ = e2e.DescribeXChain("[Interchain Workflow]", ginkgo.Label(e2e.UsesCChainL
132134

133135
ginkgo.By("importing AVAX from the X-Chain to the P-Chain", func() {
134136
_, err := pWallet.IssueImportTx(
135-
xWallet.BlockchainID(),
137+
xContext.BlockchainID,
136138
&recipientOwner,
137139
e2e.WithDefaultContext(),
138140
)

tests/e2e/x/transfer/virtuous.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ var _ = e2e.DescribeXChainSerial("[Virtuous Transfer Tx AVAX]", func() {
8484

8585
keychain := secp256k1fx.NewKeychain(testKeys...)
8686
baseWallet := e2e.NewWallet(keychain, e2e.Env.GetRandomNodeURI())
87-
avaxAssetID := baseWallet.X().AVAXAssetID()
87+
xWallet := baseWallet.X()
88+
xBuilder := xWallet.Builder()
89+
xContext := xBuilder.Context()
90+
avaxAssetID := xContext.AVAXAssetID
8891

8992
wallets := make([]primary.Wallet, len(testKeys))
9093
shortAddrs := make([]ids.ShortID, len(testKeys))
@@ -146,7 +149,7 @@ var _ = e2e.DescribeXChainSerial("[Virtuous Transfer Tx AVAX]", func() {
146149

147150
amountToTransfer := senderOrigBal / 10
148151

149-
senderNewBal := senderOrigBal - amountToTransfer - baseWallet.X().BaseTxFee()
152+
senderNewBal := senderOrigBal - amountToTransfer - xContext.BaseTxFee
150153
receiverNewBal := receiverOrigBal + amountToTransfer
151154

152155
ginkgo.By("X-Chain transfer with wrong amount must fail", func() {

wallet/chain/x/backend.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,39 @@
44
package x
55

66
import (
7+
"context"
8+
79
"github.com/ava-labs/avalanchego/vms/avm/txs"
10+
"github.com/ava-labs/avalanchego/wallet/chain/x/builder"
11+
"github.com/ava-labs/avalanchego/wallet/chain/x/signer"
812
"github.com/ava-labs/avalanchego/wallet/subnet/primary/common"
9-
10-
stdcontext "context"
1113
)
1214

1315
var _ Backend = (*backend)(nil)
1416

1517
// Backend defines the full interface required to support an X-chain wallet.
1618
type Backend interface {
1719
common.ChainUTXOs
18-
BuilderBackend
19-
SignerBackend
20+
builder.Backend
21+
signer.Backend
2022

21-
AcceptTx(ctx stdcontext.Context, tx *txs.Tx) error
23+
AcceptTx(ctx context.Context, tx *txs.Tx) error
2224
}
2325

2426
type backend struct {
25-
Context
2627
common.ChainUTXOs
28+
29+
context *builder.Context
2730
}
2831

29-
func NewBackend(ctx Context, utxos common.ChainUTXOs) Backend {
32+
func NewBackend(context *builder.Context, utxos common.ChainUTXOs) Backend {
3033
return &backend{
31-
Context: ctx,
3234
ChainUTXOs: utxos,
35+
context: context,
3336
}
3437
}
3538

36-
func (b *backend) AcceptTx(ctx stdcontext.Context, tx *txs.Tx) error {
39+
func (b *backend) AcceptTx(ctx context.Context, tx *txs.Tx) error {
3740
err := tx.Unsigned.Visit(&backendVisitor{
3841
b: b,
3942
ctx: ctx,
@@ -43,7 +46,7 @@ func (b *backend) AcceptTx(ctx stdcontext.Context, tx *txs.Tx) error {
4346
return err
4447
}
4548

46-
chainID := b.Context.BlockchainID()
49+
chainID := b.context.BlockchainID
4750
inputUTXOs := tx.Unsigned.InputUTXOs()
4851
for _, utxoID := range inputUTXOs {
4952
if utxoID.Symbol {

0 commit comments

Comments
 (0)