github.com/MetalBlockchain/metalgo@v1.11.9/wallet/chain/p/backend_visitor.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package p 5 6 import ( 7 "context" 8 "errors" 9 10 "github.com/MetalBlockchain/metalgo/ids" 11 "github.com/MetalBlockchain/metalgo/utils/constants" 12 "github.com/MetalBlockchain/metalgo/vms/components/avax" 13 "github.com/MetalBlockchain/metalgo/vms/platformvm/txs" 14 ) 15 16 var ( 17 _ txs.Visitor = (*backendVisitor)(nil) 18 19 ErrUnsupportedTxType = errors.New("unsupported tx type") 20 ) 21 22 // backendVisitor handles accepting of transactions for the backend 23 type backendVisitor struct { 24 b *backend 25 ctx context.Context 26 txID ids.ID 27 } 28 29 func (*backendVisitor) AdvanceTimeTx(*txs.AdvanceTimeTx) error { 30 return ErrUnsupportedTxType 31 } 32 33 func (*backendVisitor) RewardValidatorTx(*txs.RewardValidatorTx) error { 34 return ErrUnsupportedTxType 35 } 36 37 func (b *backendVisitor) AddValidatorTx(tx *txs.AddValidatorTx) error { 38 return b.baseTx(&tx.BaseTx) 39 } 40 41 func (b *backendVisitor) AddSubnetValidatorTx(tx *txs.AddSubnetValidatorTx) error { 42 return b.baseTx(&tx.BaseTx) 43 } 44 45 func (b *backendVisitor) AddDelegatorTx(tx *txs.AddDelegatorTx) error { 46 return b.baseTx(&tx.BaseTx) 47 } 48 49 func (b *backendVisitor) CreateChainTx(tx *txs.CreateChainTx) error { 50 return b.baseTx(&tx.BaseTx) 51 } 52 53 func (b *backendVisitor) CreateSubnetTx(tx *txs.CreateSubnetTx) error { 54 b.b.setSubnetOwner( 55 b.txID, 56 tx.Owner, 57 ) 58 return b.baseTx(&tx.BaseTx) 59 } 60 61 func (b *backendVisitor) RemoveSubnetValidatorTx(tx *txs.RemoveSubnetValidatorTx) error { 62 return b.baseTx(&tx.BaseTx) 63 } 64 65 func (b *backendVisitor) TransferSubnetOwnershipTx(tx *txs.TransferSubnetOwnershipTx) error { 66 b.b.setSubnetOwner( 67 tx.Subnet, 68 tx.Owner, 69 ) 70 return b.baseTx(&tx.BaseTx) 71 } 72 73 func (b *backendVisitor) BaseTx(tx *txs.BaseTx) error { 74 return b.baseTx(tx) 75 } 76 77 func (b *backendVisitor) ImportTx(tx *txs.ImportTx) error { 78 err := b.b.removeUTXOs( 79 b.ctx, 80 tx.SourceChain, 81 tx.InputUTXOs(), 82 ) 83 if err != nil { 84 return err 85 } 86 return b.baseTx(&tx.BaseTx) 87 } 88 89 func (b *backendVisitor) ExportTx(tx *txs.ExportTx) error { 90 for i, out := range tx.ExportedOutputs { 91 err := b.b.AddUTXO( 92 b.ctx, 93 tx.DestinationChain, 94 &avax.UTXO{ 95 UTXOID: avax.UTXOID{ 96 TxID: b.txID, 97 OutputIndex: uint32(len(tx.Outs) + i), 98 }, 99 Asset: avax.Asset{ID: out.AssetID()}, 100 Out: out.Out, 101 }, 102 ) 103 if err != nil { 104 return err 105 } 106 } 107 return b.baseTx(&tx.BaseTx) 108 } 109 110 func (b *backendVisitor) TransformSubnetTx(tx *txs.TransformSubnetTx) error { 111 return b.baseTx(&tx.BaseTx) 112 } 113 114 func (b *backendVisitor) AddPermissionlessValidatorTx(tx *txs.AddPermissionlessValidatorTx) error { 115 return b.baseTx(&tx.BaseTx) 116 } 117 118 func (b *backendVisitor) AddPermissionlessDelegatorTx(tx *txs.AddPermissionlessDelegatorTx) error { 119 return b.baseTx(&tx.BaseTx) 120 } 121 122 func (b *backendVisitor) baseTx(tx *txs.BaseTx) error { 123 return b.b.removeUTXOs( 124 b.ctx, 125 constants.PlatformChainID, 126 tx.InputIDs(), 127 ) 128 }