chore(wallet)_: Fix tests after wallet api sign and send clean up

- Get rid of InsertTestMultiTransaction function in test utils and
use InsertMultiTransaction method of transaction manager
- Use MultiTransaction type instead of TestMultiTransaction

Added a missing wallet DB migration file for multi transactions
This commit is contained in:
Ivan Belyakov 2024-05-03 12:46:46 +02:00 committed by IvanBelyakoff
parent ed164e4ac5
commit 3b6b38a414
8 changed files with 271 additions and 193 deletions

View File

@ -96,6 +96,7 @@ func setupTestActivityDBStorageChoice(tb testing.TB, inMemory bool) (deps Filter
}
func setupTestActivityDB(tb testing.TB) (deps FilterDependencies, close func()) {
transfer.SetMultiTransactionIDGenerator(transfer.StaticIDCounter()) // to have different multi-transaction IDs even with fast execution
return setupTestActivityDBStorageChoice(tb, true)
}
@ -108,10 +109,10 @@ type testData struct {
multiTx2Tr2 transfer.TestTransfer // index 6, SNT/Mainnet
multiTx2PendingTr transfer.TestTransfer // index 7, DAI/Mainnet
multiTx1 transfer.TestMultiTransaction
multiTx1 transfer.MultiTransaction
multiTx1ID common.MultiTransactionIDType
multiTx2 transfer.TestMultiTransaction
multiTx2 transfer.MultiTransaction
multiTx2ID common.MultiTransactionIDType
nextIndex int
@ -136,7 +137,7 @@ func fillTestData(t *testing.T, db *sql.DB) (td testData, fromAddresses, toAddre
td.multiTx1Tr2 = trs[4]
td.multiTx1 = transfer.GenerateTestSendMultiTransaction(td.multiTx1Tr1)
td.multiTx1.ToToken = testutils.DaiSymbol
td.multiTx1.ToAsset = testutils.DaiSymbol
td.multiTx1ID = transfer.InsertTestMultiTransaction(t, db, &td.multiTx1)
td.multiTx1Tr1.MultiTransactionID = td.multiTx1ID
@ -151,7 +152,8 @@ func fillTestData(t *testing.T, db *sql.DB) (td testData, fromAddresses, toAddre
td.multiTx2PendingTr = trs[6]
td.multiTx2 = transfer.GenerateTestSendMultiTransaction(td.multiTx2Tr1)
td.multiTx2.ToToken = testutils.SntSymbol
td.multiTx2.ToAsset = testutils.SntSymbol
td.multiTx2ID = transfer.InsertTestMultiTransaction(t, db, &td.multiTx2)
td.multiTx2Tr1.MultiTransactionID = td.multiTx2ID
@ -250,13 +252,13 @@ func TestGetActivityEntriesAll(t *testing.T) {
payloadType: MultiTransactionPT,
transaction: nil,
id: td.multiTx1ID,
timestamp: td.multiTx1.Timestamp,
timestamp: int64(td.multiTx1.Timestamp),
activityType: SendAT,
activityStatus: FinalizedAS,
amountOut: (*hexutil.Big)(big.NewInt(td.multiTx1.FromAmount)),
amountIn: (*hexutil.Big)(big.NewInt(td.multiTx1.ToAmount)),
tokenOut: tokenFromSymbol(nil, td.multiTx1.FromToken),
tokenIn: tokenFromSymbol(nil, td.multiTx1.ToToken),
amountOut: td.multiTx1.FromAmount,
amountIn: td.multiTx1.ToAmount,
tokenOut: tokenFromSymbol(nil, td.multiTx1.FromAsset),
tokenIn: tokenFromSymbol(nil, td.multiTx1.ToAsset),
symbolOut: common.NewAndSet("USDC"),
symbolIn: common.NewAndSet("DAI"),
sender: &td.multiTx1.FromAddress,
@ -266,15 +268,15 @@ func TestGetActivityEntriesAll(t *testing.T) {
payloadType: MultiTransactionPT,
transaction: nil,
id: td.multiTx2ID,
timestamp: td.multiTx2.Timestamp,
timestamp: int64(td.multiTx2.Timestamp),
activityType: SendAT,
activityStatus: PendingAS,
amountOut: (*hexutil.Big)(big.NewInt(td.multiTx2.FromAmount)),
amountIn: (*hexutil.Big)(big.NewInt(td.multiTx2.ToAmount)),
amountOut: td.multiTx2.FromAmount,
amountIn: td.multiTx2.ToAmount,
symbolOut: common.NewAndSet("USDC"),
symbolIn: common.NewAndSet("SNT"),
tokenOut: tokenFromSymbol(nil, td.multiTx2.FromToken),
tokenIn: tokenFromSymbol(nil, td.multiTx2.ToToken),
tokenOut: tokenFromSymbol(nil, td.multiTx2.FromAsset),
tokenIn: tokenFromSymbol(nil, td.multiTx2.ToAsset),
sender: &td.multiTx2.FromAddress,
recipient: &td.multiTx2.ToAddress,
}, entries[0])
@ -331,43 +333,44 @@ func TestGetActivityEntriesFilterByTime(t *testing.T) {
// Test start only
var filter Filter
filter.Period.StartTimestamp = td.multiTx1.Timestamp
filter.Period.StartTimestamp = int64(td.multiTx1.Timestamp)
filter.Period.EndTimestamp = NoLimitTimestampForPeriod
entries, err := getActivityEntries(context.Background(), deps, allAddresses, true, []common.ChainID{}, filter, 0, 15)
require.NoError(t, err)
require.Equal(t, 8, len(entries))
const simpleTrIndex = 5
// Check start and end content
require.Equal(t, Entry{
payloadType: SimpleTransactionPT,
transaction: &transfer.TransactionIdentity{ChainID: trs[5].ChainID, Hash: trs[5].Hash, Address: trs[5].To},
transaction: &transfer.TransactionIdentity{ChainID: trs[simpleTrIndex].ChainID, Hash: trs[simpleTrIndex].Hash, Address: trs[simpleTrIndex].To},
id: 0,
timestamp: trs[5].Timestamp,
timestamp: trs[simpleTrIndex].Timestamp,
activityType: ReceiveAT,
activityStatus: FinalizedAS,
amountOut: (*hexutil.Big)(big.NewInt(0)),
amountIn: (*hexutil.Big)(big.NewInt(trs[5].Value)),
amountIn: (*hexutil.Big)(big.NewInt(trs[simpleTrIndex].Value)),
tokenOut: nil,
tokenIn: TTrToToken(t, &trs[5].TestTransaction),
tokenIn: TTrToToken(t, &trs[simpleTrIndex].TestTransaction),
symbolOut: nil,
symbolIn: common.NewAndSet("USDC"),
sender: &trs[5].From,
recipient: &trs[5].To,
sender: &trs[simpleTrIndex].From,
recipient: &trs[simpleTrIndex].To,
chainIDOut: nil,
chainIDIn: &trs[5].ChainID,
transferType: expectedTokenType(trs[5].Token.Address),
chainIDIn: &trs[simpleTrIndex].ChainID,
transferType: expectedTokenType(trs[simpleTrIndex].Token.Address),
}, entries[0])
require.Equal(t, Entry{
payloadType: MultiTransactionPT,
transaction: nil,
id: td.multiTx1ID,
timestamp: td.multiTx1.Timestamp,
timestamp: int64(td.multiTx1.Timestamp),
activityType: SendAT,
activityStatus: FinalizedAS,
amountOut: (*hexutil.Big)(big.NewInt(td.multiTx1.FromAmount)),
amountIn: (*hexutil.Big)(big.NewInt(td.multiTx1.ToAmount)),
tokenOut: tokenFromSymbol(nil, td.multiTx1.FromToken),
tokenIn: tokenFromSymbol(nil, td.multiTx1.ToToken),
amountOut: td.multiTx1.FromAmount,
amountIn: td.multiTx1.ToAmount,
tokenOut: tokenFromSymbol(nil, td.multiTx1.FromAsset),
tokenIn: tokenFromSymbol(nil, td.multiTx1.ToAsset),
symbolOut: common.NewAndSet("USDC"),
symbolIn: common.NewAndSet("DAI"),
sender: &td.multiTx1.FromAddress,
@ -407,13 +410,13 @@ func TestGetActivityEntriesFilterByTime(t *testing.T) {
payloadType: MultiTransactionPT,
transaction: nil,
id: td.multiTx1ID,
timestamp: td.multiTx1.Timestamp,
timestamp: int64(td.multiTx1.Timestamp),
activityType: SendAT,
activityStatus: FinalizedAS,
amountOut: (*hexutil.Big)(big.NewInt(td.multiTx1.FromAmount)),
amountIn: (*hexutil.Big)(big.NewInt(td.multiTx1.ToAmount)),
tokenOut: tokenFromSymbol(nil, td.multiTx1.FromToken),
tokenIn: tokenFromSymbol(nil, td.multiTx1.ToToken),
amountOut: td.multiTx1.FromAmount,
amountIn: td.multiTx1.ToAmount,
tokenOut: tokenFromSymbol(nil, td.multiTx1.FromAsset),
tokenIn: tokenFromSymbol(nil, td.multiTx1.ToAsset),
symbolOut: common.NewAndSet("USDC"),
symbolIn: common.NewAndSet("DAI"),
sender: &td.multiTx1.FromAddress,
@ -632,7 +635,7 @@ func TestGetActivityEntriesFilterByType(t *testing.T) {
// Adds 4 extractable transactions
td, tdFromAdds, tdToAddrs := fillTestData(t, deps.db)
// Add 5 extractable transactions: one MultiTransactionSwap, two MultiTransactionBridge and two MultiTransactionSend
multiTxs := make([]transfer.TestMultiTransaction, 5)
multiTxs := make([]transfer.MultiTransaction, 5)
trs, fromAddrs, toAddrs := transfer.GenerateTestTransfers(t, deps.db, td.nextIndex, len(multiTxs)*2)
multiTxs[0] = transfer.GenerateTestBridgeMultiTransaction(trs[0], trs[1])
multiTxs[1] = transfer.GenerateTestSwapMultiTransaction(trs[2], testutils.SntSymbol, 100) // trs[3]
@ -874,13 +877,13 @@ func TestGetActivityEntriesFilterByAddresses(t *testing.T) {
payloadType: MultiTransactionPT,
transaction: nil,
id: td.multiTx2ID,
timestamp: td.multiTx2.Timestamp,
timestamp: int64(td.multiTx2.Timestamp),
activityType: SendAT,
activityStatus: PendingAS,
amountOut: (*hexutil.Big)(big.NewInt(td.multiTx2.FromAmount)),
amountIn: (*hexutil.Big)(big.NewInt(td.multiTx2.ToAmount)),
tokenOut: tokenFromSymbol(nil, td.multiTx2.FromToken),
tokenIn: tokenFromSymbol(nil, td.multiTx2.ToToken),
amountOut: td.multiTx2.FromAmount,
amountIn: td.multiTx2.ToAmount,
tokenOut: tokenFromSymbol(nil, td.multiTx2.FromAsset),
tokenIn: tokenFromSymbol(nil, td.multiTx2.ToAsset),
symbolOut: common.NewAndSet("USDC"),
symbolIn: common.NewAndSet("SNT"),
sender: &td.multiTx2.FromAddress,
@ -1206,14 +1209,14 @@ func TestGetActivityEntriesFilterByNetworksOfSubTransactions(t *testing.T) {
trs[2].ChainID = 1233
mt1 := transfer.GenerateTestBridgeMultiTransaction(trs[0], trs[1])
trs[0].MultiTransactionID = transfer.InsertTestMultiTransaction(t, deps.db, &mt1)
trs[1].MultiTransactionID = mt1.MultiTransactionID
trs[2].MultiTransactionID = mt1.MultiTransactionID
trs[1].MultiTransactionID = mt1.ID
trs[2].MultiTransactionID = mt1.ID
trs[3].ChainID = 1234
mt2 := transfer.GenerateTestSwapMultiTransaction(trs[3], testutils.SntSymbol, 100)
// insertMultiTransaction will insert 0 instead of NULL
mt2.FromNetworkID = common.NewAndSet(uint64(0))
mt2.ToNetworkID = common.NewAndSet(uint64(0))
mt2.FromNetworkID = 0
mt2.ToNetworkID = 0
trs[3].MultiTransactionID = transfer.InsertTestMultiTransaction(t, deps.db, &mt2)
for i := range trs {
@ -1234,20 +1237,20 @@ func TestGetActivityEntriesFilterByNetworksOfSubTransactions(t *testing.T) {
entries, err = getActivityEntries(context.Background(), deps, toTrs, false, chainIDs, filter, 0, 15)
require.NoError(t, err)
require.Equal(t, 1, len(entries))
require.Equal(t, entries[0].id, mt1.MultiTransactionID)
require.Equal(t, entries[0].id, mt1.ID)
// Filter by pending_transactions sub-transacitons
chainIDs = []common.ChainID{trs[2].ChainID}
entries, err = getActivityEntries(context.Background(), deps, toTrs, false, chainIDs, filter, 0, 15)
require.NoError(t, err)
require.Equal(t, 1, len(entries))
require.Equal(t, entries[0].id, mt1.MultiTransactionID)
require.Equal(t, entries[0].id, mt1.ID)
chainIDs = []common.ChainID{trs[3].ChainID}
entries, err = getActivityEntries(context.Background(), deps, toTrs, false, chainIDs, filter, 0, 15)
require.NoError(t, err)
require.Equal(t, 1, len(entries))
require.Equal(t, entries[0].id, mt2.MultiTransactionID)
require.Equal(t, entries[0].id, mt2.ID)
}
func TestGetActivityEntriesCheckToAndFrom(t *testing.T) {
@ -1366,11 +1369,11 @@ func TestGetMultiTxDetails(t *testing.T) {
_, err := getMultiTxDetails(context.Background(), deps.db, 0)
require.EqualError(t, err, "invalid tx id")
details, err := getMultiTxDetails(context.Background(), deps.db, int(td.multiTx1.MultiTransactionID))
details, err := getMultiTxDetails(context.Background(), deps.db, int(td.multiTx1.ID))
require.NoError(t, err)
require.Equal(t, "", details.ID)
require.Equal(t, int(td.multiTx1.MultiTransactionID), details.MultiTxID)
require.Equal(t, int(td.multiTx1.ID), details.MultiTxID)
require.Equal(t, td.multiTx1Tr2.Nonce, details.Nonce)
require.Equal(t, 2, len(details.ChainDetails))
require.Equal(t, td.multiTx1Tr1.ChainID, common.ChainID(details.ChainDetails[0].ChainID))

View File

@ -36,17 +36,17 @@ func setupBenchmark(b *testing.B, accountsCount int, inMemory bool) (deps Filter
}
i := 0
multiTxs := make([]transfer.TestMultiTransaction, mtSendCount+mtSwapCount+mtBridgeCount)
multiTxs := make([]transfer.MultiTransaction, mtSendCount+mtSwapCount+mtBridgeCount)
for ; i < mtSendCount; i++ {
multiTxs[i] = transfer.GenerateTestSendMultiTransaction(trs[i])
trs[i].From = accounts[i%len(accounts)]
multiTxs[i].FromAddress = trs[i].From
// Currently the network ID is not filled in for send transactions
multiTxs[i].FromNetworkID = nil
multiTxs[i].ToNetworkID = nil
multiTxs[i].FromNetworkID = 0
multiTxs[i].ToNetworkID = 0
multiTxs[i].MultiTransactionID = transfer.InsertTestMultiTransaction(b, deps.db, &multiTxs[i])
trs[i].MultiTransactionID = multiTxs[i].MultiTransactionID
multiTxs[i].ID = transfer.InsertTestMultiTransaction(b, deps.db, &multiTxs[i])
trs[i].MultiTransactionID = multiTxs[i].ID
}
for j := 0; j < mtSwapCount; i, j = i+1, j+1 {
@ -54,8 +54,8 @@ func setupBenchmark(b *testing.B, accountsCount int, inMemory bool) (deps Filter
trs[i].From = accounts[i%len(accounts)]
multiTxs[i].FromAddress = trs[i].From
multiTxs[i].MultiTransactionID = transfer.InsertTestMultiTransaction(b, deps.db, &multiTxs[i])
trs[i].MultiTransactionID = multiTxs[i].MultiTransactionID
multiTxs[i].ID = transfer.InsertTestMultiTransaction(b, deps.db, &multiTxs[i])
trs[i].MultiTransactionID = multiTxs[i].ID
}
for mtIdx := 0; mtIdx < mtBridgeCount; i, mtIdx = i+2, mtIdx+1 {
@ -68,9 +68,9 @@ func setupBenchmark(b *testing.B, accountsCount int, inMemory bool) (deps Filter
multiTxs[mtIdx].ToAddress = trs[secondTrIdx].To
multiTxs[mtIdx].FromAddress = trs[i].From
multiTxs[mtIdx].MultiTransactionID = transfer.InsertTestMultiTransaction(b, deps.db, &multiTxs[mtIdx])
trs[firstTrIdx].MultiTransactionID = multiTxs[mtIdx].MultiTransactionID
trs[secondTrIdx].MultiTransactionID = multiTxs[mtIdx].MultiTransactionID
multiTxs[mtIdx].ID = transfer.InsertTestMultiTransaction(b, deps.db, &multiTxs[mtIdx])
trs[firstTrIdx].MultiTransactionID = multiTxs[mtIdx].ID
trs[secondTrIdx].MultiTransactionID = multiTxs[mtIdx].ID
}
for i = 0; i < transactionCount-pendingCount; i++ {

View File

@ -29,10 +29,10 @@ func setupTestFilterDB(t *testing.T) (db *sql.DB, close func()) {
}
// insertTestData inserts 6 extractable activity entries: 2 transfers, 2 pending transactions and 2 multi transactions
func insertTestData(t *testing.T, db *sql.DB, nullifyToForIndexes []int) (trs []transfer.TestTransfer, toTrs []eth.Address, multiTxs []transfer.TestMultiTransaction) {
func insertTestData(t *testing.T, db *sql.DB, nullifyToForIndexes []int) (trs []transfer.TestTransfer, toTrs []eth.Address, multiTxs []transfer.MultiTransaction) {
// Add 6 extractable transactions
trs, _, toTrs = transfer.GenerateTestTransfers(t, db, 0, 10)
multiTxs = []transfer.TestMultiTransaction{
multiTxs = []transfer.MultiTransaction{
transfer.GenerateTestBridgeMultiTransaction(trs[0], trs[1]),
transfer.GenerateTestSwapMultiTransaction(trs[2], testutils.SntSymbol, 100),
}
@ -89,7 +89,7 @@ func TestGetRecipients(t *testing.T) {
dupTrs, _, _ := transfer.GenerateTestTransfers(t, db, 8, 4)
dupTrs[0].To = trs[1].To
dupTrs[2].To = trs[2].To
dupMultiTxs := []transfer.TestMultiTransaction{
dupMultiTxs := []transfer.MultiTransaction{
transfer.GenerateTestSendMultiTransaction(dupTrs[0]),
transfer.GenerateTestSwapMultiTransaction(dupTrs[2], testutils.SntSymbol, 100),
}
@ -159,7 +159,7 @@ func TestGetOldestTimestampEmptyDB(t *testing.T) {
timestamp, err := GetOldestTimestamp(context.Background(), db, []eth.Address{eth.HexToAddress("0x1")})
require.NoError(t, err)
require.Equal(t, int64(0), timestamp)
require.Equal(t, uint64(0), timestamp)
}
func TestGetOldestTimestamp(t *testing.T) {
@ -178,14 +178,14 @@ func TestGetOldestTimestamp(t *testing.T) {
trs[3].To,
})
require.NoError(t, err)
require.Equal(t, trs[3].Timestamp, timestamp)
require.Equal(t, uint64(trs[3].Timestamp), timestamp)
// Test from filter
timestamp, err = GetOldestTimestamp(context.Background(), db, []eth.Address{
trs[4].From,
})
require.NoError(t, err)
require.Equal(t, trs[4].Timestamp, timestamp)
require.Equal(t, uint64(trs[4].Timestamp), timestamp)
// Test MT
timestamp, err = GetOldestTimestamp(context.Background(), db, []eth.Address{
@ -199,7 +199,7 @@ func TestGetOldestTimestamp(t *testing.T) {
trs[6].To,
})
require.NoError(t, err)
require.Equal(t, trs[6].Timestamp, timestamp)
require.Equal(t, uint64(trs[6].Timestamp), timestamp)
}
func TestGetOldestTimestamp_NullAddresses(t *testing.T) {
@ -219,21 +219,21 @@ func TestGetOldestTimestamp_NullAddresses(t *testing.T) {
// Extract oldest timestamp, no filter
timestamp, err := GetOldestTimestamp(context.Background(), db, []eth.Address{})
require.NoError(t, err)
require.Equal(t, trs[0].Timestamp, timestamp)
require.Equal(t, uint64(trs[0].Timestamp), timestamp)
// Test to filter
timestamp, err = GetOldestTimestamp(context.Background(), db, []eth.Address{
trs[1].To, trs[2].To,
})
require.NoError(t, err)
require.Equal(t, trs[1].Timestamp, timestamp)
require.Equal(t, uint64(trs[1].Timestamp), timestamp)
// Test from filter
timestamp, err = GetOldestTimestamp(context.Background(), db, []eth.Address{
trs[1].From,
})
require.NoError(t, err)
require.Equal(t, int64(0), timestamp)
require.Equal(t, uint64(0), timestamp)
}
func TestGetActivityCollectiblesEmptyDB(t *testing.T) {

View File

@ -35,6 +35,7 @@ func TestController_watchAccountsChanges(t *testing.T) {
accountFeed := &event.Feed{}
bcstate := blockchainstate.NewBlockChainState()
SetMultiTransactionIDGenerator(StaticIDCounter()) // to have different multi-transaction IDs even with fast execution
transactionManager := NewTransactionManager(walletDB, nil, nil, nil, accountsDB, nil, nil)
c := NewTransferController(
walletDB,

View File

@ -39,10 +39,10 @@ type TestTransfer struct {
type TestMultiTransaction struct {
MultiTransactionID common.MultiTransactionIDType
MultiTransactionType MultiTransactionType
Type MultiTransactionType
FromAddress eth_common.Address
ToAddress eth_common.Address
FromToken string
FromAsset string
ToToken string
FromAmount int64
ToAmount int64
@ -93,42 +93,42 @@ func generateTestTransfer(seed int) TestTransfer {
}
}
func GenerateTestSendMultiTransaction(tr TestTransfer) TestMultiTransaction {
return TestMultiTransaction{
MultiTransactionType: MultiTransactionSend,
func GenerateTestSendMultiTransaction(tr TestTransfer) MultiTransaction {
return MultiTransaction{
Type: MultiTransactionSend,
FromAddress: tr.From,
ToAddress: tr.To,
FromToken: tr.Token.Symbol,
ToToken: tr.Token.Symbol,
FromAmount: tr.Value,
ToAmount: 0,
Timestamp: tr.Timestamp,
FromAsset: tr.Token.Symbol,
ToAsset: tr.Token.Symbol,
FromAmount: (*hexutil.Big)(big.NewInt(tr.Value)),
ToAmount: (*hexutil.Big)(big.NewInt(0)),
Timestamp: uint64(tr.Timestamp),
}
}
func GenerateTestSwapMultiTransaction(tr TestTransfer, toToken string, toAmount int64) TestMultiTransaction {
return TestMultiTransaction{
MultiTransactionType: MultiTransactionSwap,
func GenerateTestSwapMultiTransaction(tr TestTransfer, toToken string, toAmount int64) MultiTransaction {
return MultiTransaction{
Type: MultiTransactionSwap,
FromAddress: tr.From,
ToAddress: tr.To,
FromToken: tr.Token.Symbol,
ToToken: toToken,
FromAmount: tr.Value,
ToAmount: toAmount,
Timestamp: tr.Timestamp,
FromAsset: tr.Token.Symbol,
ToAsset: toToken,
FromAmount: (*hexutil.Big)(big.NewInt(tr.Value)),
ToAmount: (*hexutil.Big)(big.NewInt(toAmount)),
Timestamp: uint64(tr.Timestamp),
}
}
func GenerateTestBridgeMultiTransaction(fromTr, toTr TestTransfer) TestMultiTransaction {
return TestMultiTransaction{
MultiTransactionType: MultiTransactionBridge,
func GenerateTestBridgeMultiTransaction(fromTr, toTr TestTransfer) MultiTransaction {
return MultiTransaction{
Type: MultiTransactionBridge,
FromAddress: fromTr.From,
ToAddress: toTr.To,
FromToken: fromTr.Token.Symbol,
ToToken: toTr.Token.Symbol,
FromAmount: fromTr.Value,
ToAmount: toTr.Value,
Timestamp: fromTr.Timestamp,
FromAsset: fromTr.Token.Symbol,
ToAsset: toTr.Token.Symbol,
FromAmount: (*hexutil.Big)(big.NewInt(fromTr.Value)),
ToAmount: (*hexutil.Big)(big.NewInt(toTr.Value)),
Timestamp: uint64(fromTr.Timestamp),
}
}
@ -367,30 +367,34 @@ func InsertTestPendingTransaction(tb testing.TB, db *sql.DB, tr *TestTransfer) {
require.NoError(tb, err)
}
func InsertTestMultiTransaction(tb testing.TB, db *sql.DB, tr *TestMultiTransaction) common.MultiTransactionIDType {
fromTokenType := tr.FromToken
if tr.FromToken == "" {
fromTokenType = testutils.EthSymbol
func InsertTestMultiTransaction(tb testing.TB, db *sql.DB, tr *MultiTransaction) common.MultiTransactionIDType {
if tr.FromAsset == "" {
tr.FromAsset = testutils.EthSymbol
}
toTokenType := tr.ToToken
if tr.ToToken == "" {
toTokenType = testutils.EthSymbol
if tr.ToAsset == "" {
tr.ToAsset = testutils.EthSymbol
}
fromAmount := (*hexutil.Big)(big.NewInt(tr.FromAmount))
toAmount := (*hexutil.Big)(big.NewInt(tr.ToAmount))
result, err := db.Exec(`
INSERT INTO multi_transactions (from_address, from_asset, from_amount, to_address, to_asset, to_amount, type, timestamp, from_network_id, to_network_id
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
tr.FromAddress, fromTokenType, fromAmount.String(), tr.ToAddress, toTokenType, toAmount.String(), tr.MultiTransactionType, tr.Timestamp, tr.FromNetworkID, tr.ToNetworkID)
tr.ID = multiTransactionIDGenerator()
err := insertMultiTransaction(db, tr)
require.NoError(tb, err)
rowID, err := result.LastInsertId()
require.NoError(tb, err)
tr.MultiTransactionID = common.MultiTransactionIDType(rowID)
return tr.MultiTransactionID
return tr.ID
}
// For using in tests only outside the package
func SaveTransfersMarkBlocksLoaded(database *Database, chainID uint64, address eth_common.Address, transfers []Transfer, blocks []*big.Int) error {
return saveTransfersMarkBlocksLoaded(database.client, chainID, address, transfers, blocks)
}
func SetMultiTransactionIDGenerator(f func() common.MultiTransactionIDType) {
multiTransactionIDGenerator = f
}
func StaticIDCounter() (f func() common.MultiTransactionIDType) {
var i int
f = func() common.MultiTransactionIDType {
i++
return common.MultiTransactionIDType(i)
}
return
}

View File

@ -18,6 +18,7 @@ import (
func setupTestTransactionDB(t *testing.T) (*TransactionManager, func()) {
db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{})
require.NoError(t, err)
SetMultiTransactionIDGenerator(StaticIDCounter()) // to have different multi-transaction IDs even with fast execution
return &TransactionManager{db, nil, nil, nil, nil, nil, nil, nil, nil, nil}, func() {
require.NoError(t, db.Close())
}
@ -80,9 +81,8 @@ func TestBridgeMultiTransactions(t *testing.T) {
var err error
ids := make([]wallet_common.MultiTransactionIDType, len(trxs))
for i, trx := range trxs {
ids[i], err = insertMultiTransaction(manager.db, trx)
ids[i], err = manager.InsertMultiTransaction(trx)
require.NoError(t, err)
require.Equal(t, wallet_common.MultiTransactionIDType(i+1), ids[i])
}
rst, err := manager.GetBridgeOriginMultiTransaction(context.Background(), trx1.ToNetworkID, trx1.CrossTxID)
@ -126,7 +126,7 @@ func TestMultiTransactions(t *testing.T) {
trx2 := trx1
trx2.FromAmount = (*hexutil.Big)(big.NewInt(456))
trx2.ToAmount = (*hexutil.Big)(big.NewInt(567))
trx2.ID = generateMultiTransactionID()
trx2.ID = multiTransactionIDGenerator()
require.NotEqual(t, trx1.ID, trx2.ID)
@ -135,9 +135,8 @@ func TestMultiTransactions(t *testing.T) {
var err error
ids := make([]wallet_common.MultiTransactionIDType, len(trxs))
for i, trx := range trxs {
ids[i], err = insertMultiTransaction(manager.db, trx)
ids[i], err = manager.InsertMultiTransaction(trx)
require.NoError(t, err)
require.Equal(t, wallet_common.MultiTransactionIDType(i+1), ids[i])
}
rst, err := manager.GetMultiTransactions(context.Background(), []wallet_common.MultiTransactionIDType{ids[0], 555})

View File

@ -25,6 +25,7 @@
// 1708089811_add_nullable_fiesl_blocks_ranges.up.sql (450B)
// 1710189541_add_nonce_to_pending_transactions.up.sql (54B)
// 1712567001_add_soulbound_collectible_cache.up.sql (75B)
// 1714670633_add_id_to_multi_transaction_table.up.sql (1.15kB)
// doc.go (94B)
package migrations
@ -35,6 +36,7 @@ import (
"crypto/sha256"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
@ -44,7 +46,7 @@ import (
func bindataRead(data []byte, name string) ([]byte, error) {
gz, err := gzip.NewReader(bytes.NewBuffer(data))
if err != nil {
return nil, fmt.Errorf("read %q: %w", name, err)
return nil, fmt.Errorf("read %q: %v", name, err)
}
var buf bytes.Buffer
@ -52,7 +54,7 @@ func bindataRead(data []byte, name string) ([]byte, error) {
clErr := gz.Close()
if err != nil {
return nil, fmt.Errorf("read %q: %w", name, err)
return nil, fmt.Errorf("read %q: %v", name, err)
}
if clErr != nil {
return nil, err
@ -593,6 +595,26 @@ func _1712567001_add_soulbound_collectible_cacheUpSql() (*asset, error) {
return a, nil
}
var __1714670633_add_id_to_multi_transaction_tableUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x53\xc1\x6e\x1a\x31\x14\xbc\xef\x57\x8c\x72\x6a\x24\xf3\x05\x3d\x19\xd6\x49\x56\x5d\x76\x23\x63\x1a\xe5\xb4\x72\xb1\x29\x56\x58\x7b\x65\x1b\x01\x7f\x5f\x79\x93\x12\x93\x12\x72\xed\xd5\x9e\x37\xef\xbd\x99\x37\x93\x09\x66\x5e\xcb\xa8\x21\xb1\x72\xc3\x11\x6e\x8d\x7e\xb7\x8d\xa6\x8b\x5e\xda\x20\x57\xd1\x38\x1b\x10\xe5\xaf\xad\xc6\xde\xc4\x0d\xa4\x85\x54\xca\xa4\x77\xb9\xc5\xca\x6d\x77\xbd\xc5\xda\x79\xc4\x8d\xc6\xe0\x4d\x2f\xfd\x11\x2f\xfa\x58\xcc\x38\xa3\x82\x41\xd0\x69\xcd\x60\xf5\xbe\x7b\x25\xf9\x56\x00\x80\x51\xa8\x1a\xc1\xee\x19\xc7\x23\xaf\xe6\x94\x3f\xe3\x07\x7b\x26\x98\x4c\x40\x95\x82\x4c\x05\xd7\xc8\x13\xc7\xda\xbb\xbe\x93\x4a\x79\x1d\x02\x7e\x52\x3e\x7b\xa0\x1c\x4d\x2b\xd0\x2c\xeb\x9a\x64\x90\x10\x74\xbc\x0a\xe8\xdd\xce\x7e\x86\x88\xee\x8b\x1e\x09\x70\xa5\x43\x3c\x0e\xfa\xb3\x2f\xd3\xeb\x10\x65\x3f\x60\xd9\x2c\xaa\xfb\x86\x95\x98\x56\xf7\x55\x23\x2e\x74\x38\x1b\x31\x9b\xdd\xea\xb8\x77\xfe\xa5\x33\xea\x23\xc9\xa9\xf6\x2b\xc8\xca\xbb\x10\xba\x78\x48\x80\xbf\x83\x96\xec\x8e\x2e\x6b\x81\x9b\x9b\xac\x57\x3c\x74\x1b\x19\x36\x98\xd6\xed\xf4\xc4\x9e\x3f\x16\xb7\x78\xaa\xc4\x43\xbb\x14\xe0\xed\x53\x55\x7e\x2f\x8a\x74\x60\xe9\xae\x94\x8c\xb2\xa8\x9a\x05\xe3\x22\x39\xdf\xe6\x17\x61\x14\x39\x33\x93\x64\xbe\x91\xdc\x22\x92\xb9\x41\x4e\xc2\x93\x51\x63\xf2\x2e\x27\x79\x57\x8c\x7c\x54\x89\x9c\x2b\x42\xf2\xed\xc9\xd9\x9a\x24\xdb\xee\x76\xdc\x76\xc1\x6a\x36\x13\xf0\x6e\xff\xff\x4f\x3c\x0e\x7c\xc7\xdb\xf9\x85\x38\xbf\xda\x52\x7a\x37\x8c\xb9\xd2\x07\x13\xa2\xb1\xbf\xdf\x52\x2e\xad\x82\xd7\x56\xf6\x7a\xfc\x4d\x41\x1c\x3f\x8a\x92\xb7\x8f\x6f\x71\xbe\xc4\x49\x6b\xc1\xf8\x3f\x71\xe7\xac\xa1\x73\x06\xd1\x5e\xaa\xf9\x13\x00\x00\xff\xff\xaa\xa3\x4b\x14\x7e\x04\x00\x00")
func _1714670633_add_id_to_multi_transaction_tableUpSqlBytes() ([]byte, error) {
return bindataRead(
__1714670633_add_id_to_multi_transaction_tableUpSql,
"1714670633_add_id_to_multi_transaction_table.up.sql",
)
}
func _1714670633_add_id_to_multi_transaction_tableUpSql() (*asset, error) {
bytes, err := _1714670633_add_id_to_multi_transaction_tableUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "1714670633_add_id_to_multi_transaction_table.up.sql", size: 1150, mode: os.FileMode(0644), modTime: time.Unix(1700000000, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa2, 0x17, 0x7e, 0x5a, 0x17, 0x7c, 0xf8, 0x9c, 0x60, 0xe4, 0xca, 0xd9, 0x32, 0xe5, 0x37, 0xd1, 0xa5, 0xcb, 0x56, 0xf4, 0x1e, 0x9e, 0x8d, 0x1b, 0x8d, 0x66, 0xaa, 0xd9, 0xce, 0x68, 0x3e, 0xcd}}
return a, nil
}
var _docGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x2c\xcb\x41\x0e\x02\x31\x08\x05\xd0\x7d\x4f\xf1\x2f\x00\xe8\xca\xc4\xc4\xc3\xa0\x43\x08\x19\x5b\xc6\x96\xfb\xc7\x4d\xdf\xfe\x5d\xfa\x39\xd5\x0d\xeb\xf7\x6d\x4d\xc4\xf3\xe9\x36\x6c\x6a\x19\x3c\xe9\x1d\xe3\xd0\x52\x50\xcf\xa3\xa2\xdb\xeb\xfe\xb8\x6d\xa0\xeb\x74\xf4\xf0\xa9\x15\x39\x16\x28\xc1\x2c\x7b\xb0\x27\x58\xda\x3f\x00\x00\xff\xff\x57\xd4\xd5\x90\x5e\x00\x00\x00")
func docGoBytes() ([]byte, error) {
@ -705,47 +727,69 @@ func AssetNames() []string {
// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
"1691753758_initial.up.sql": _1691753758_initialUpSql,
"1692701329_add_collectibles_and_collections_data_cache.up.sql": _1692701329_add_collectibles_and_collections_data_cacheUpSql,
"1692701339_add_scope_to_pending.up.sql": _1692701339_add_scope_to_pendingUpSql,
"1694540071_add_collectibles_ownership_update_timestamp.up.sql": _1694540071_add_collectibles_ownership_update_timestampUpSql,
"1694692748_add_raw_balance_to_token_balances.up.sql": _1694692748_add_raw_balance_to_token_balancesUpSql,
"1695133989_add_community_id_to_collectibles_and_collections_data_cache.up.sql": _1695133989_add_community_id_to_collectibles_and_collections_data_cacheUpSql,
"1695932536_balance_history_v2.up.sql": _1695932536_balance_history_v2UpSql,
"1696853635_input_data.up.sql": _1696853635_input_dataUpSql,
"1698117918_add_community_id_to_tokens.up.sql": _1698117918_add_community_id_to_tokensUpSql,
"1698257443_add_community_metadata_to_wallet_db.up.sql": _1698257443_add_community_metadata_to_wallet_dbUpSql,
"1699987075_add_timestamp_and_state_to_community_data_cache.up.sql": _1699987075_add_timestamp_and_state_to_community_data_cacheUpSql,
"1700414564_add_wallet_connect_pairings_table.up.sql": _1700414564_add_wallet_connect_pairings_tableUpSql,
"1701101493_add_token_blocks_range.up.sql": _1701101493_add_token_blocks_rangeUpSql,
"1702467441_wallet_connect_sessions_instead_of_pairings.up.sql": _1702467441_wallet_connect_sessions_instead_of_pairingsUpSql,
"1702577524_add_community_collections_and_collectibles_images_cache.up.sql": _1702577524_add_community_collections_and_collectibles_images_cacheUpSql,
"1702867707_add_balance_to_collectibles_ownership_cache.up.sql": _1702867707_add_balance_to_collectibles_ownership_cacheUpSql,
"1703686612_add_color_to_saved_addresses.up.sql": _1703686612_add_color_to_saved_addressesUpSql,
"1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql": _1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql,
"1704913491_add_type_and_tx_timestamp_to_collectibles_ownership_cache.up.sql": _1704913491_add_type_and_tx_timestamp_to_collectibles_ownership_cacheUpSql,
"1705664490_add_balance_check_fields_blocks_ranges_sequential.up.sql": _1705664490_add_balance_check_fields_blocks_ranges_sequentialUpSql,
"1706531789_remove_gasfee-only-eth-transfers.up.sql": _1706531789_remove_gasfeeOnlyEthTransfersUpSql,
"1707160323_add_contract_type_table.up.sql": _1707160323_add_contract_type_tableUpSql,
"1708089811_add_nullable_fiesl_blocks_ranges.up.sql": _1708089811_add_nullable_fiesl_blocks_rangesUpSql,
"1710189541_add_nonce_to_pending_transactions.up.sql": _1710189541_add_nonce_to_pending_transactionsUpSql,
"1712567001_add_soulbound_collectible_cache.up.sql": _1712567001_add_soulbound_collectible_cacheUpSql,
"1714670633_add_id_to_multi_transaction_table.up.sql": _1714670633_add_id_to_multi_transaction_tableUpSql,
"doc.go": docGo,
}
// AssetDebug is true if the assets were built with the debug flag enabled.
const AssetDebug = false
// AssetDir returns the file names below a certain
// directory embedded in the file by go-bindata.
// For example if you run go-bindata on data/... and data contains the
// following hierarchy:
//
// data/
// foo.txt
// img/
// a.png
// b.png
//
// then AssetDir("data") would return []string{"foo.txt", "img"},
// AssetDir("data/img") would return []string{"a.png", "b.png"},
// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and
@ -778,32 +822,33 @@ type bintree struct {
}
var _bintree = &bintree{nil, map[string]*bintree{
"1691753758_initial.up.sql": {_1691753758_initialUpSql, map[string]*bintree{}},
"1692701329_add_collectibles_and_collections_data_cache.up.sql": {_1692701329_add_collectibles_and_collections_data_cacheUpSql, map[string]*bintree{}},
"1692701339_add_scope_to_pending.up.sql": {_1692701339_add_scope_to_pendingUpSql, map[string]*bintree{}},
"1694540071_add_collectibles_ownership_update_timestamp.up.sql": {_1694540071_add_collectibles_ownership_update_timestampUpSql, map[string]*bintree{}},
"1694692748_add_raw_balance_to_token_balances.up.sql": {_1694692748_add_raw_balance_to_token_balancesUpSql, map[string]*bintree{}},
"1695133989_add_community_id_to_collectibles_and_collections_data_cache.up.sql": {_1695133989_add_community_id_to_collectibles_and_collections_data_cacheUpSql, map[string]*bintree{}},
"1695932536_balance_history_v2.up.sql": {_1695932536_balance_history_v2UpSql, map[string]*bintree{}},
"1696853635_input_data.up.sql": {_1696853635_input_dataUpSql, map[string]*bintree{}},
"1698117918_add_community_id_to_tokens.up.sql": {_1698117918_add_community_id_to_tokensUpSql, map[string]*bintree{}},
"1698257443_add_community_metadata_to_wallet_db.up.sql": {_1698257443_add_community_metadata_to_wallet_dbUpSql, map[string]*bintree{}},
"1699987075_add_timestamp_and_state_to_community_data_cache.up.sql": {_1699987075_add_timestamp_and_state_to_community_data_cacheUpSql, map[string]*bintree{}},
"1700414564_add_wallet_connect_pairings_table.up.sql": {_1700414564_add_wallet_connect_pairings_tableUpSql, map[string]*bintree{}},
"1701101493_add_token_blocks_range.up.sql": {_1701101493_add_token_blocks_rangeUpSql, map[string]*bintree{}},
"1702467441_wallet_connect_sessions_instead_of_pairings.up.sql": {_1702467441_wallet_connect_sessions_instead_of_pairingsUpSql, map[string]*bintree{}},
"1702577524_add_community_collections_and_collectibles_images_cache.up.sql": {_1702577524_add_community_collections_and_collectibles_images_cacheUpSql, map[string]*bintree{}},
"1702867707_add_balance_to_collectibles_ownership_cache.up.sql": {_1702867707_add_balance_to_collectibles_ownership_cacheUpSql, map[string]*bintree{}},
"1703686612_add_color_to_saved_addresses.up.sql": {_1703686612_add_color_to_saved_addressesUpSql, map[string]*bintree{}},
"1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql": {_1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql, map[string]*bintree{}},
"1704913491_add_type_and_tx_timestamp_to_collectibles_ownership_cache.up.sql": {_1704913491_add_type_and_tx_timestamp_to_collectibles_ownership_cacheUpSql, map[string]*bintree{}},
"1705664490_add_balance_check_fields_blocks_ranges_sequential.up.sql": {_1705664490_add_balance_check_fields_blocks_ranges_sequentialUpSql, map[string]*bintree{}},
"1706531789_remove_gasfee-only-eth-transfers.up.sql": {_1706531789_remove_gasfeeOnlyEthTransfersUpSql, map[string]*bintree{}},
"1707160323_add_contract_type_table.up.sql": {_1707160323_add_contract_type_tableUpSql, map[string]*bintree{}},
"1708089811_add_nullable_fiesl_blocks_ranges.up.sql": {_1708089811_add_nullable_fiesl_blocks_rangesUpSql, map[string]*bintree{}},
"1710189541_add_nonce_to_pending_transactions.up.sql": {_1710189541_add_nonce_to_pending_transactionsUpSql, map[string]*bintree{}},
"1712567001_add_soulbound_collectible_cache.up.sql": {_1712567001_add_soulbound_collectible_cacheUpSql, map[string]*bintree{}},
"doc.go": {docGo, map[string]*bintree{}},
"1691753758_initial.up.sql": &bintree{_1691753758_initialUpSql, map[string]*bintree{}},
"1692701329_add_collectibles_and_collections_data_cache.up.sql": &bintree{_1692701329_add_collectibles_and_collections_data_cacheUpSql, map[string]*bintree{}},
"1692701339_add_scope_to_pending.up.sql": &bintree{_1692701339_add_scope_to_pendingUpSql, map[string]*bintree{}},
"1694540071_add_collectibles_ownership_update_timestamp.up.sql": &bintree{_1694540071_add_collectibles_ownership_update_timestampUpSql, map[string]*bintree{}},
"1694692748_add_raw_balance_to_token_balances.up.sql": &bintree{_1694692748_add_raw_balance_to_token_balancesUpSql, map[string]*bintree{}},
"1695133989_add_community_id_to_collectibles_and_collections_data_cache.up.sql": &bintree{_1695133989_add_community_id_to_collectibles_and_collections_data_cacheUpSql, map[string]*bintree{}},
"1695932536_balance_history_v2.up.sql": &bintree{_1695932536_balance_history_v2UpSql, map[string]*bintree{}},
"1696853635_input_data.up.sql": &bintree{_1696853635_input_dataUpSql, map[string]*bintree{}},
"1698117918_add_community_id_to_tokens.up.sql": &bintree{_1698117918_add_community_id_to_tokensUpSql, map[string]*bintree{}},
"1698257443_add_community_metadata_to_wallet_db.up.sql": &bintree{_1698257443_add_community_metadata_to_wallet_dbUpSql, map[string]*bintree{}},
"1699987075_add_timestamp_and_state_to_community_data_cache.up.sql": &bintree{_1699987075_add_timestamp_and_state_to_community_data_cacheUpSql, map[string]*bintree{}},
"1700414564_add_wallet_connect_pairings_table.up.sql": &bintree{_1700414564_add_wallet_connect_pairings_tableUpSql, map[string]*bintree{}},
"1701101493_add_token_blocks_range.up.sql": &bintree{_1701101493_add_token_blocks_rangeUpSql, map[string]*bintree{}},
"1702467441_wallet_connect_sessions_instead_of_pairings.up.sql": &bintree{_1702467441_wallet_connect_sessions_instead_of_pairingsUpSql, map[string]*bintree{}},
"1702577524_add_community_collections_and_collectibles_images_cache.up.sql": &bintree{_1702577524_add_community_collections_and_collectibles_images_cacheUpSql, map[string]*bintree{}},
"1702867707_add_balance_to_collectibles_ownership_cache.up.sql": &bintree{_1702867707_add_balance_to_collectibles_ownership_cacheUpSql, map[string]*bintree{}},
"1703686612_add_color_to_saved_addresses.up.sql": &bintree{_1703686612_add_color_to_saved_addressesUpSql, map[string]*bintree{}},
"1704701942_remove_favourite_and_change_primary_key_for_saved_addresses.up.sql": &bintree{_1704701942_remove_favourite_and_change_primary_key_for_saved_addressesUpSql, map[string]*bintree{}},
"1704913491_add_type_and_tx_timestamp_to_collectibles_ownership_cache.up.sql": &bintree{_1704913491_add_type_and_tx_timestamp_to_collectibles_ownership_cacheUpSql, map[string]*bintree{}},
"1705664490_add_balance_check_fields_blocks_ranges_sequential.up.sql": &bintree{_1705664490_add_balance_check_fields_blocks_ranges_sequentialUpSql, map[string]*bintree{}},
"1706531789_remove_gasfee-only-eth-transfers.up.sql": &bintree{_1706531789_remove_gasfeeOnlyEthTransfersUpSql, map[string]*bintree{}},
"1707160323_add_contract_type_table.up.sql": &bintree{_1707160323_add_contract_type_tableUpSql, map[string]*bintree{}},
"1708089811_add_nullable_fiesl_blocks_ranges.up.sql": &bintree{_1708089811_add_nullable_fiesl_blocks_rangesUpSql, map[string]*bintree{}},
"1710189541_add_nonce_to_pending_transactions.up.sql": &bintree{_1710189541_add_nonce_to_pending_transactionsUpSql, map[string]*bintree{}},
"1712567001_add_soulbound_collectible_cache.up.sql": &bintree{_1712567001_add_soulbound_collectible_cacheUpSql, map[string]*bintree{}},
"1714670633_add_id_to_multi_transaction_table.up.sql": &bintree{_1714670633_add_id_to_multi_transaction_tableUpSql, map[string]*bintree{}},
"doc.go": &bintree{docGo, map[string]*bintree{}},
}}
// RestoreAsset restores an asset under the given directory.
@ -820,7 +865,7 @@ func RestoreAsset(dir, name string) error {
if err != nil {
return err
}
err = os.WriteFile(_filePath(dir, name), data, info.Mode())
err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
if err != nil {
return err
}

View File

@ -0,0 +1,26 @@
-- Create a copy of multi_transactions table with an additional column for the primary key
CREATE TABLE new_table (
id INTEGER PRIMARY KEY, -- Add a new column for the primary key
from_address VARCHAR NOT NULL,
from_asset VARCHAR NOT NULL,
from_amount VARCHAR NOT NULL,
to_address VARCHAR NOT NULL,
to_asset VARCHAR NOT NULL,
type VARCHAR NOT NULL,
timestamp UNSIGNED BIGINT NOT NULL,
to_amount VARCHAR,
from_network_id UNSIGNED BIGINT,
to_network_id UNSIGNED BIGINT,
cross_tx_id VARCHAR DEFAULT "",
from_tx_hash BLOB,
to_tx_hash BLOB
) WITHOUT ROWID;
-- Copy data
INSERT INTO new_table (id, from_address, from_asset, from_amount, to_address, to_asset, type, timestamp, to_amount, from_network_id, to_network_id, cross_tx_id, from_tx_hash, to_tx_hash)
SELECT rowid, from_address, from_asset, from_amount, to_address, to_asset, type, timestamp, to_amount, from_network_id, to_network_id, cross_tx_id, from_tx_hash, to_tx_hash
FROM multi_transactions;
-- Drop the existing table and rename the new table
DROP TABLE multi_transactions;
ALTER TABLE new_table RENAME TO multi_transactions;