Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

X-Chain - repackaged wallet backends #2762

Merged
merged 18 commits into from
Mar 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions indexer/examples/x-chain-blocks/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

"github.com/ava-labs/avalanchego/indexer"
"github.com/ava-labs/avalanchego/vms/proposervm/block"
"github.com/ava-labs/avalanchego/wallet/chain/x"
"github.com/ava-labs/avalanchego/wallet/chain/x/builder"
"github.com/ava-labs/avalanchego/wallet/subnet/primary"
)

Expand All @@ -37,7 +37,7 @@ func main() {
}

avmBlockBytes := proposerVMBlock.Block()
avmBlock, err := x.Parser.ParseBlock(avmBlockBytes)
avmBlock, err := builder.Parser.ParseBlock(avmBlockBytes)
if err != nil {
log.Fatalf("failed to parse avm block: %s\n", err)
}
Expand Down
45 changes: 27 additions & 18 deletions tests/antithesis/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ import (
"github.com/ava-labs/avalanchego/vms/platformvm/status"
"github.com/ava-labs/avalanchego/vms/propertyfx"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
"github.com/ava-labs/avalanchego/wallet/chain/x"
"github.com/ava-labs/avalanchego/wallet/subnet/primary"
"github.com/ava-labs/avalanchego/wallet/subnet/primary/common"

xtxs "github.com/ava-labs/avalanchego/vms/avm/txs"
ptxs "github.com/ava-labs/avalanchego/vms/platformvm/txs"
xbuilder "github.com/ava-labs/avalanchego/wallet/chain/x/builder"
)

const NumKeys = 5
Expand Down Expand Up @@ -69,8 +69,10 @@ func main() {
workloads[0] = genesisWorkload

var (
genesisXWallet = wallet.X()
avaxAssetID = genesisXWallet.AVAXAssetID()
genesisXWallet = wallet.X()
genesisXBuilder = genesisXWallet.Builder()
genesisXContext = genesisXBuilder.Context()
avaxAssetID = genesisXContext.AVAXAssetID
)
for i := 1; i < NumKeys; i++ {
key, err := secp256k1.NewPrivateKey()
Expand Down Expand Up @@ -192,7 +194,8 @@ func (w *workload) run(ctx context.Context) {
log.Fatalf("failed to fetch P-chain balances: %s", err)
}
var (
avaxAssetID = xWallet.AVAXAssetID()
xContext = xBuilder.Context()
avaxAssetID = xContext.AVAXAssetID
xAVAX = xBalances[avaxAssetID]
pAVAX = pBalances[avaxAssetID]
)
Expand Down Expand Up @@ -245,9 +248,10 @@ func (w *workload) issueXChainBaseTx(ctx context.Context) {
}

var (
avaxAssetID = xWallet.AVAXAssetID()
xContext = xBuilder.Context()
avaxAssetID = xContext.AVAXAssetID
avaxBalance = balances[avaxAssetID]
baseTxFee = xWallet.BaseTxFee()
baseTxFee = xContext.BaseTxFee
neededBalance = baseTxFee + units.Schmeckle
)
if avaxBalance < neededBalance {
Expand Down Expand Up @@ -294,9 +298,10 @@ func (w *workload) issueXChainCreateAssetTx(ctx context.Context) {
}

var (
avaxAssetID = xWallet.AVAXAssetID()
xContext = xBuilder.Context()
avaxAssetID = xContext.AVAXAssetID
avaxBalance = balances[avaxAssetID]
neededBalance = xWallet.CreateAssetTxFee()
neededBalance = xContext.CreateAssetTxFee
)
if avaxBalance < neededBalance {
log.Printf("skipping X-chain tx issuance due to insufficient balance: %d < %d", avaxBalance, neededBalance)
Expand Down Expand Up @@ -342,10 +347,11 @@ func (w *workload) issueXChainOperationTx(ctx context.Context) {
}

var (
avaxAssetID = xWallet.AVAXAssetID()
xContext = xBuilder.Context()
avaxAssetID = xContext.AVAXAssetID
avaxBalance = balances[avaxAssetID]
createAssetTxFee = xWallet.CreateAssetTxFee()
baseTxFee = xWallet.BaseTxFee()
createAssetTxFee = xContext.CreateAssetTxFee
baseTxFee = xContext.BaseTxFee
neededBalance = createAssetTxFee + baseTxFee
)
if avaxBalance < neededBalance {
Expand Down Expand Up @@ -405,9 +411,10 @@ func (w *workload) issueXToPTransfer(ctx context.Context) {
}

var (
avaxAssetID = xWallet.AVAXAssetID()
xContext = xBuilder.Context()
avaxAssetID = xContext.AVAXAssetID
avaxBalance = balances[avaxAssetID]
xBaseTxFee = xWallet.BaseTxFee()
xBaseTxFee = xContext.BaseTxFee
pBuilder = pWallet.Builder()
pContext = pBuilder.Context()
pBaseTxFee = pContext.BaseTxFee
Expand Down Expand Up @@ -441,7 +448,7 @@ func (w *workload) issueXToPTransfer(ctx context.Context) {
log.Printf("created X-chain export transaction %s in %s", exportTx.ID(), time.Since(exportStartTime))

var (
xChainID = xWallet.BlockchainID()
xChainID = xContext.BlockchainID
importStartTime = time.Now()
)
importTx, err := pWallet.IssueImportTx(
Expand All @@ -464,6 +471,7 @@ func (w *workload) issuePToXTransfer(ctx context.Context) {
var (
xWallet = w.wallet.X()
pWallet = w.wallet.P()
xBuilder = xWallet.Builder()
pBuilder = pWallet.Builder()
)
balances, err := pBuilder.GetBalance()
Expand All @@ -473,11 +481,12 @@ func (w *workload) issuePToXTransfer(ctx context.Context) {
}

var (
xContext = xBuilder.Context()
pContext = pBuilder.Context()
avaxAssetID = pContext.AVAXAssetID
avaxBalance = balances[avaxAssetID]
pBaseTxFee = pContext.BaseTxFee
xBaseTxFee = xWallet.BaseTxFee()
xBaseTxFee = xContext.BaseTxFee
txFees = pBaseTxFee + xBaseTxFee
neededBalance = txFees + units.Schmeckle
)
Expand All @@ -487,7 +496,7 @@ func (w *workload) issuePToXTransfer(ctx context.Context) {
}

var (
xChainID = xWallet.BlockchainID()
xChainID = xContext.BlockchainID
owner = w.makeOwner()
exportStartTime = time.Now()
)
Expand Down Expand Up @@ -573,7 +582,7 @@ func (w *workload) confirmPChainTx(ctx context.Context, tx *ptxs.Tx) {

func (w *workload) verifyXChainTxConsumedUTXOs(ctx context.Context, tx *xtxs.Tx) {
txID := tx.ID()
chainID := w.wallet.X().BlockchainID()
chainID := w.wallet.X().Builder().Context().BlockchainID
for _, uri := range w.uris {
client := avm.NewClient(uri, "X")

Expand All @@ -582,7 +591,7 @@ func (w *workload) verifyXChainTxConsumedUTXOs(ctx context.Context, tx *xtxs.Tx)
ctx,
utxos,
client,
x.Parser.Codec(),
xbuilder.Parser.Codec(),
chainID,
chainID,
w.addrs.List(),
Expand Down
4 changes: 3 additions & 1 deletion tests/e2e/banff/suites.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ var _ = ginkgo.Describe("[Banff]", func() {
// Get the P-chain and the X-chain wallets
pWallet := wallet.P()
xWallet := wallet.X()
xBuilder := xWallet.Builder()
xContext := xBuilder.Context()

// Pull out useful constants to use when issuing transactions.
xChainID := xWallet.BlockchainID()
xChainID := xContext.BlockchainID
owner := &secp256k1fx.OutputOwners{
Threshold: 1,
Addrs: []ids.ShortID{
Expand Down
6 changes: 4 additions & 2 deletions tests/e2e/c/interchain_workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ var _ = e2e.DescribeCChain("[Interchain Workflow]", func() {
pWallet := baseWallet.P()

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

ginkgo.By("exporting AVAX from the C-Chain to the X-Chain", func() {
_, err := cWallet.IssueExportTx(
xWallet.BlockchainID(),
xContext.BlockchainID,
exportOutputs,
e2e.WithDefaultContext(),
e2e.WithSuggestedGasPrice(ethClient),
Expand Down
6 changes: 4 additions & 2 deletions tests/e2e/p/interchain_workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,14 @@ var _ = e2e.DescribePChain("[Interchain Workflow]", ginkgo.Label(e2e.UsesCChainL
cWallet := baseWallet.C()
pWallet := baseWallet.P()

xBuilder := xWallet.Builder()
xContext := xBuilder.Context()
pBuilder := pWallet.Builder()
pContext := pBuilder.Context()

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

ginkgo.By("exporting AVAX from the P-Chain to the X-Chain", func() {
_, err := pWallet.IssueExportTx(
xWallet.BlockchainID(),
xContext.BlockchainID,
exportOutputs,
e2e.WithDefaultContext(),
)
Expand Down
4 changes: 3 additions & 1 deletion tests/e2e/p/permissionless_subnets.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ var _ = e2e.DescribePChain("[Permissionless Subnets]", func() {

pWallet := baseWallet.P()
xWallet := baseWallet.X()
xChainID := xWallet.BlockchainID()
xBuilder := xWallet.Builder()
xContext := xBuilder.Context()
xChainID := xContext.BlockchainID

var validatorID ids.NodeID
ginkgo.By("retrieving the node ID of a primary network validator", func() {
Expand Down
4 changes: 3 additions & 1 deletion tests/e2e/p/workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ var _ = e2e.DescribePChain("[Workflow]", func() {
pContext := pBuilder.Context()
avaxAssetID := pContext.AVAXAssetID
xWallet := baseWallet.X()
xBuilder := xWallet.Builder()
xContext := xBuilder.Context()
pChainClient := platformvm.NewClient(nodeURI.URI)

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

ginkgo.By("export avax from P to X chain", func() {
_, err := pWallet.IssueExportTx(
xWallet.BlockchainID(),
xContext.BlockchainID,
[]*avax.TransferableOutput{
{
Asset: avax.Asset{
Expand Down
8 changes: 5 additions & 3 deletions tests/e2e/x/interchain_workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ var _ = e2e.DescribeXChain("[Interchain Workflow]", ginkgo.Label(e2e.UsesCChainL

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

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

ginkgo.By("importing AVAX from the X-Chain to the P-Chain", func() {
_, err := pWallet.IssueImportTx(
xWallet.BlockchainID(),
xContext.BlockchainID,
&recipientOwner,
e2e.WithDefaultContext(),
)
Expand Down
7 changes: 5 additions & 2 deletions tests/e2e/x/transfer/virtuous.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,10 @@ var _ = e2e.DescribeXChainSerial("[Virtuous Transfer Tx AVAX]", func() {

keychain := secp256k1fx.NewKeychain(testKeys...)
baseWallet := e2e.NewWallet(keychain, e2e.Env.GetRandomNodeURI())
avaxAssetID := baseWallet.X().AVAXAssetID()
xWallet := baseWallet.X()
xBuilder := xWallet.Builder()
xContext := xBuilder.Context()
avaxAssetID := xContext.AVAXAssetID

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

amountToTransfer := senderOrigBal / 10

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

ginkgo.By("X-Chain transfer with wrong amount must fail", func() {
Expand Down
23 changes: 13 additions & 10 deletions wallet/chain/x/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,39 @@
package x

import (
"context"

"github.com/ava-labs/avalanchego/vms/avm/txs"
"github.com/ava-labs/avalanchego/wallet/chain/x/builder"
"github.com/ava-labs/avalanchego/wallet/chain/x/signer"
"github.com/ava-labs/avalanchego/wallet/subnet/primary/common"

stdcontext "context"
)

var _ Backend = (*backend)(nil)

// Backend defines the full interface required to support an X-chain wallet.
type Backend interface {
common.ChainUTXOs
BuilderBackend
SignerBackend
builder.Backend
signer.Backend

AcceptTx(ctx stdcontext.Context, tx *txs.Tx) error
AcceptTx(ctx context.Context, tx *txs.Tx) error
}

type backend struct {
Context
common.ChainUTXOs

context *builder.Context
}

func NewBackend(ctx Context, utxos common.ChainUTXOs) Backend {
func NewBackend(context *builder.Context, utxos common.ChainUTXOs) Backend {
return &backend{
Context: ctx,
ChainUTXOs: utxos,
context: context,
}
}

func (b *backend) AcceptTx(ctx stdcontext.Context, tx *txs.Tx) error {
func (b *backend) AcceptTx(ctx context.Context, tx *txs.Tx) error {
err := tx.Unsigned.Visit(&backendVisitor{
b: b,
ctx: ctx,
Expand All @@ -43,7 +46,7 @@ func (b *backend) AcceptTx(ctx stdcontext.Context, tx *txs.Tx) error {
return err
}

chainID := b.Context.BlockchainID()
chainID := b.context.BlockchainID
inputUTXOs := tx.Unsigned.InputUTXOs()
for _, utxoID := range inputUTXOs {
if utxoID.Symbol {
Expand Down
6 changes: 3 additions & 3 deletions wallet/chain/x/backend_visitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@
package x

import (
"context"

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/vms/avm/txs"
"github.com/ava-labs/avalanchego/vms/components/avax"

stdcontext "context"
)

var _ txs.Visitor = (*backendVisitor)(nil)

// backendVisitor handles accepting of transactions for the backend
type backendVisitor struct {
b *backend
ctx stdcontext.Context
ctx context.Context
txID ids.ID
}

Expand Down
Loading
Loading