Skip to content

Commit d668493

Browse files
committed
Make FromConfirmedTransaction safe wrt versioning
1 parent 24d0d61 commit d668493

File tree

1 file changed

+4
-83
lines changed

1 file changed

+4
-83
lines changed

pkg/code/data/transaction/transaction.go

Lines changed: 4 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/code-payments/code-server/pkg/code/config"
1111
"github.com/code-payments/code-server/pkg/solana"
1212
"github.com/mr-tron/base58/base58"
13+
"github.com/pkg/errors"
1314
)
1415

1516
// Token balance changes as a result of a transaction
@@ -86,48 +87,11 @@ func (r *Record) Unmarshal() (*solana.Transaction, error) {
8687
return &tx, nil
8788
}
8889

89-
func FromTransaction(tx *solana.Transaction) (*Record, error) {
90-
sig := tx.Signature()
91-
res := &Record{
92-
Signature: base58.Encode(sig),
93-
Data: tx.Marshal(),
94-
ConfirmationState: ConfirmationUnknown,
95-
CreatedAt: time.Now(),
90+
func FromConfirmedTransaction(tx *solana.ConfirmedTransaction) (*Record, error) {
91+
if tx.Transaction.Message.Version != solana.MessageVersionLegacy {
92+
return nil, errors.New("unsupported transaction version")
9693
}
97-
return res, nil
98-
}
9994

100-
func FromBlockTransaction(tx *solana.BlockTransaction, slot uint64, t time.Time) (*Record, error) {
101-
sig := tx.Transaction.Signature()
102-
res := &Record{
103-
Signature: base58.Encode(sig),
104-
Slot: slot,
105-
Data: tx.Transaction.Marshal(),
106-
HasErrors: tx.Err != nil,
107-
BlockTime: t,
108-
ConfirmationState: ConfirmationFinalized,
109-
CreatedAt: time.Now(),
110-
}
111-
112-
if res.HasErrors {
113-
res.ConfirmationState = ConfirmationFailed
114-
}
115-
116-
if tx.Meta != nil {
117-
res.Fee = &tx.Meta.Fee
118-
}
119-
120-
tokenBalances, err := getTokenBalanceSet(tx.Meta, tx.Transaction.Message.Accounts)
121-
if err != nil {
122-
return nil, err
123-
}
124-
125-
res.TokenBalances = tokenBalances
126-
127-
return res, nil
128-
}
129-
130-
func FromConfirmedTransaction(tx *solana.ConfirmedTransaction) (*Record, error) {
13195
sig := tx.Transaction.Signature()
13296
res := &Record{
13397
Signature: base58.Encode(sig),
@@ -156,49 +120,6 @@ func FromConfirmedTransaction(tx *solana.ConfirmedTransaction) (*Record, error)
156120
return res, nil
157121
}
158122

159-
func FromLocalSimulation(tx *solana.Transaction, pre, post map[string]uint64) (*Record, error) {
160-
sig := tx.Signature()
161-
res := &Record{
162-
Signature: base58.Encode(sig),
163-
Data: tx.Marshal(),
164-
ConfirmationState: ConfirmationUnknown,
165-
CreatedAt: time.Now(),
166-
}
167-
168-
txBalances := map[string]*TokenBalance{}
169-
170-
for tokenAccount, tokenBalance := range pre {
171-
if val, ok := txBalances[tokenAccount]; ok {
172-
val.PreBalance = tokenBalance
173-
} else {
174-
txBalances[tokenAccount] = &TokenBalance{
175-
Account: tokenAccount,
176-
PreBalance: tokenBalance,
177-
}
178-
}
179-
}
180-
181-
for tokenAccount, tokenBalance := range post {
182-
if val, ok := txBalances[tokenAccount]; ok {
183-
val.PostBalance = tokenBalance
184-
} else {
185-
txBalances[tokenAccount] = &TokenBalance{
186-
Account: tokenAccount,
187-
PostBalance: tokenBalance,
188-
}
189-
}
190-
}
191-
192-
var tokenBalances []*TokenBalance
193-
for _, tb := range txBalances {
194-
tokenBalances = append(tokenBalances, tb)
195-
}
196-
197-
res.TokenBalances = tokenBalances
198-
199-
return res, nil
200-
}
201-
202123
func getTokenBalanceSet(meta *solana.TransactionMeta, accounts []ed25519.PublicKey) ([]*TokenBalance, error) {
203124
txBalances := map[string]*TokenBalance{}
204125

0 commit comments

Comments
 (0)