feat: Handled token mint activity (#4126)

This commit is contained in:
Cuteivist 2023-10-11 07:10:08 +02:00 committed by GitHub
parent 1410b1e422
commit 6798d1ac5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 1130 additions and 50 deletions

View File

@ -317,6 +317,7 @@ const (
//go:embed filter.sql
var queryFormatString string
var mintATQuery = "SELECT hash FROM input_data WHERE method IN ('mint', 'mintToken')"
type FilterDependencies struct {
db *sql.DB
@ -425,8 +426,26 @@ func getActivityEntries(ctx context.Context, deps FilterDependencies, addresses
return strconv.Itoa(int(t))
})
inputDataMethods := make([]string, 0)
if includeAllStatuses || sliceContains(filter.Types, MintAT) || sliceContains(filter.Types, ReceiveAT) {
inputDataRows, err := deps.db.QueryContext(ctx, mintATQuery)
if err != nil {
return nil, err
}
for inputDataRows.Next() {
var inputData sql.NullString
err := inputDataRows.Scan(&inputData)
if err == nil && inputData.Valid {
inputDataMethods = append(inputDataMethods, inputData.String)
}
}
}
queryString := fmt.Sprintf(queryFormatString, involvedAddresses, toAddresses, assetsTokenCodes, assetsERC20, assetsERC721, networks,
layer2Networks, joinedMTTypes)
layer2Networks, mintATQuery, joinedMTTypes)
// The duplicated temporary table UNION with CTE acts as an optimization
// As soon as we use filter_addresses CTE or filter_addresses_table temp table
@ -471,10 +490,12 @@ func getActivityEntries(ctx context.Context, deps FilterDependencies, addresses
var dbTrAmount sql.NullString
var dbMtFromAmount, dbMtToAmount, contractType sql.NullString
var tokenCode, fromTokenCode, toTokenCode sql.NullString
var methodHash sql.NullString
var transferType *TransferType
err := rows.Scan(&transferHash, &pendingHash, &chainID, &multiTxID, &timestamp, &dbMtType, &dbTrType, &fromAddress,
&toAddressDB, &ownerAddressDB, &dbTrAmount, &dbMtFromAmount, &dbMtToAmount, &aggregatedStatus, &aggregatedCount,
&tokenAddress, &dbTokenID, &tokenCode, &fromTokenCode, &toTokenCode, &outChainIDDB, &inChainIDDB, &contractType, &contractAddressDB)
&tokenAddress, &dbTokenID, &tokenCode, &fromTokenCode, &toTokenCode, &outChainIDDB, &inChainIDDB, &contractType,
&contractAddressDB, &methodHash)
if err != nil {
return nil, err
}
@ -486,6 +507,7 @@ func getActivityEntries(ctx context.Context, deps FilterDependencies, addresses
if contractType.Valid {
transferType = contractTypeFromDBType(contractType.String)
}
if len(contractAddressDB) > 0 {
contractAddress = new(eth.Address)
*contractAddress = eth.BytesToAddress(contractAddressDB)
@ -499,10 +521,13 @@ func getActivityEntries(ctx context.Context, deps FilterDependencies, addresses
}
return SendAT, fromAddress
} else if trType.Byte == toTrType {
if fromAddress == ZeroAddress && transferType != nil && *transferType == TransferTypeErc721 {
return MintAT, toAddress
at := ReceiveAT
if fromAddress == ZeroAddress && transferType != nil {
if *transferType == TransferTypeErc721 || (*transferType == TransferTypeErc20 && methodHash.Valid && sliceContains(inputDataMethods, methodHash.String)) {
at = MintAT
}
}
return ReceiveAT, toAddress
return at, toAddress
}
}
log.Warn(fmt.Sprintf("unexpected activity type. Missing from [%s] or to [%s] in addresses?", fromAddress, toAddress))
@ -626,7 +651,6 @@ func getActivityEntries(ctx context.Context, deps FilterDependencies, addresses
}
// Complete common data
entry.sender = &fromAddress
entry.recipient = &toAddress
entry.sender = &fromAddress
entry.recipient = &toAddress

View File

@ -3,6 +3,7 @@ package activity
import (
"context"
"database/sql"
"encoding/hex"
"math/big"
"testing"
"time"
@ -647,22 +648,31 @@ func TestGetActivityEntriesFilterByType(t *testing.T) {
transfer.InsertTestTransfer(t, deps.db, trs[i].To, &trs[i])
}
trsSpecial, fromSpecial, toSpecial := transfer.GenerateTestTransfers(t, deps.db, 100, 2)
trsSpecial, fromSpecial, toSpecial := transfer.GenerateTestTransfers(t, deps.db, 100, 3)
// Here not to include the modified To and From addresses
allAddresses := append(append(append(append(append(tdFromAdds, tdToAddrs...), fromAddrs...), toAddrs...), fromSpecial...), toSpecial...)
// Insert MintAT
// Insert MintAT Collectible
trsSpecial[0].From = eth.HexToAddress("0x0")
transfer.InsertTestTransferWithOptions(t, deps.db, trsSpecial[0].To, &trsSpecial[0], &transfer.TestTransferOptions{
TokenAddress: eth.HexToAddress("0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"),
TokenID: (big.NewInt(1318)),
})
// Insert MintAT Token
trsSpecial[1].From = eth.HexToAddress("0x0")
inputMethod, err := hex.DecodeString("1b5ee6ae")
require.NoError(t, err)
transfer.InsertTestTransferWithOptions(t, deps.db, trsSpecial[1].To, &trsSpecial[1], &transfer.TestTransferOptions{
TokenAddress: eth.HexToAddress("0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb49"),
Tx: transfer.GenerateTxField(inputMethod),
})
// Insert ContractDeploymentAt
trsSpecial[1].To = eth.HexToAddress("0x0")
transfer.InsertTestTransferWithOptions(t, deps.db, trsSpecial[1].From, &trsSpecial[1], &transfer.TestTransferOptions{
NullifyAddresses: []eth.Address{trsSpecial[1].To},
trsSpecial[2].To = eth.HexToAddress("0x0")
transfer.InsertTestTransferWithOptions(t, deps.db, trsSpecial[2].From, &trsSpecial[2], &transfer.TestTransferOptions{
NullifyAddresses: []eth.Address{trsSpecial[2].To},
})
// Test filtering out without address involved
@ -670,14 +680,15 @@ func TestGetActivityEntriesFilterByType(t *testing.T) {
filter.Types = allActivityTypesFilter()
// Set tr1 to Receive and pendingTr to Send; rest of two MT remain default Send
addresses := []eth.Address{td.tr1.To, td.pendingTr.From, td.multiTx1.FromAddress, td.multiTx2.FromAddress, trs[0].From, trs[2].From, trs[4].From, trs[6].From, trs[8].From, trsSpecial[0].To, trsSpecial[1].From}
addresses := []eth.Address{td.tr1.To, td.pendingTr.From, td.multiTx1.FromAddress, td.multiTx2.FromAddress, trs[0].From, trs[2].From, trs[4].From, trs[6].From, trs[8].From, trsSpecial[0].To, trsSpecial[1].To, trsSpecial[2].From}
entries, err := getActivityEntries(context.Background(), deps, addresses, false, []common.ChainID{}, filter, 0, 15)
require.NoError(t, err)
require.Equal(t, 11, len(entries))
require.Equal(t, 12, len(entries))
filter.Types = []Type{SendAT, SwapAT}
entries, err = getActivityEntries(context.Background(), deps, addresses, false, []common.ChainID{}, filter, 0, 15)
require.NoError(t, err)
// 3 from td Send + 2 trs MT Send + 1 (swap)
require.Equal(t, 6, len(entries))
@ -706,13 +717,13 @@ func TestGetActivityEntriesFilterByType(t *testing.T) {
filter.Types = []Type{MintAT}
entries, err = getActivityEntries(context.Background(), deps, addresses, false, []common.ChainID{}, filter, 0, 15)
require.NoError(t, err)
require.Equal(t, 1, len(entries))
require.Equal(t, 2, len(entries))
sendCount, receiveCount, contractCount, mintCount, swapCount, _, bridgeCount = countTypes(entries)
require.Equal(t, 0, sendCount)
require.Equal(t, 0, receiveCount)
require.Equal(t, 0, contractCount)
require.Equal(t, 1, mintCount)
require.Equal(t, 2, mintCount)
require.Equal(t, 0, swapCount)
require.Equal(t, 0, bridgeCount)

View File

@ -152,6 +152,9 @@ pending_network_ids AS (
layer2_networks(network_id) AS (
VALUES
%s
),
mint_methods(method_hash) AS (
%s
)
SELECT
transfers.hash AS transfer_hash,
@ -199,7 +202,11 @@ SELECT
NULL AS out_network_id,
NULL AS in_network_id,
transfers.type AS type,
transfers.contract_address AS contract_address
transfers.contract_address AS contract_address,
CASE
WHEN transfers.tx_from_address = zeroAddress AND transfers.type = "erc20" THEN substr(json_extract(tx, '$.input'), 1, 10)
ELSE NULL
END AS method_hash
FROM
transfers
CROSS JOIN filter_conditions
@ -235,11 +242,18 @@ WHERE
filterActivityTypeReceive
AND tr_type = toTrType -- Check NOT MintAT
AND NOT (
transfers.type = 'erc721'
AND (
(
transfers.tx_from_address IS NULL
OR transfers.tx_from_address = zeroAddress
)
AND (
transfers.type = 'erc721'
OR (
transfers.type = 'erc20'
AND method_hash IS NOT NULL
AND method_hash IN mint_methods
)
)
)
)
OR (
@ -253,11 +267,18 @@ WHERE
OR (
filterActivityTypeMint
AND tr_type = toTrType
AND transfers.type = 'erc721'
AND (
transfers.tx_from_address IS NULL
OR transfers.tx_from_address = zeroAddress
)
AND (
transfers.type = 'erc721'
OR (
transfers.type = 'erc20'
AND method_hash IS NOT NULL
AND method_hash IN mint_methods
)
)
)
)
AND (
@ -351,7 +372,8 @@ SELECT
NULL AS out_network_id,
NULL AS in_network_id,
pending_transactions.type AS type,
NULL as contract_address
NULL as contract_address,
NULL AS method_hash
FROM
pending_transactions
CROSS JOIN filter_conditions
@ -440,7 +462,8 @@ SELECT
multi_transactions.from_network_id AS out_network_id,
multi_transactions.to_network_id AS in_network_id,
NULL AS type,
NULL as contract_address
NULL as contract_address,
NULL AS method_hash
FROM
multi_transactions
CROSS JOIN filter_conditions

View File

@ -8,6 +8,7 @@ import (
eth_common "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/status-im/status-go/services/wallet/common"
w_common "github.com/status-im/status-go/services/wallet/common"
@ -253,6 +254,13 @@ type TestTransferOptions struct {
TokenAddress eth_common.Address
TokenID *big.Int
NullifyAddresses []eth_common.Address
Tx *types.Transaction
}
func GenerateTxField(data []byte) *types.Transaction {
return types.NewTx(&types.DynamicFeeTx{
Data: data,
})
}
func InsertTestTransferWithOptions(tb testing.TB, db *sql.DB, address eth_common.Address, tr *TestTransfer, opt *TestTransferOptions) {
@ -327,6 +335,7 @@ func InsertTestTransferWithOptions(tb testing.TB, db *sql.DB, address eth_common
tokenAddress: &opt.TokenAddress,
contractAddress: &tr.Contract,
tokenID: opt.TokenID,
transaction: opt.Tx,
}
err = updateOrInsertTransfersDBFields(tx, []transferDBFields{transfer})
require.NoError(tb, err)

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,989 @@
CREATE TABLE "input_data" (
"id" INTEGER,
"hash" TEXT NOT NULL,
"method" TEXT NOT NULL,
UNIQUE("hash","method"),
PRIMARY KEY("id" AUTOINCREMENT)
);
INSERT into input_data (method, hash)
VALUES
('mintToken','0x1b5ee6ae'),
('mintToken','0x02cda089'),
('mintToken','0x15848166'),
('mintToken','0x01173a74'),
('mintToken','0x0423f240'),
('mintToken','0x051beb97'),
('mintToken','0x13649ba4'),
('mintToken','0x1268bdec'),
('mintToken','0x0f30cde0'),
('mintToken','0x0e5210eb'),
('mintToken','0x0c8eccea'),
('mintToken','0x2004ffd9'),
('mintToken','0x20cbf5f9'),
('mintToken','0x23a36d2b'),
('mintToken','0x23e5e822'),
('mintToken','0x278e0b88'),
('mintToken','0x33d509a6'),
('mintToken','0x33eba49a'),
('mintToken','0x3a857ee6'),
('mintToken','0x3d02d0c9'),
('mintToken','0x46ad3dd4'),
('mintToken','0x4ae550cd'),
('mintToken','0x4b51e932'),
('mintToken','0x530d4bc2'),
('mintToken','0x56bd04e3'),
('mintToken','0x5bb61017'),
('mintToken','0x5edd1b68'),
('mintToken','0x611b2fed'),
('mintToken','0x6289fa61'),
('mintToken','0x6383b9b0'),
('mintToken','0x63f8ec41'),
('mintToken','0x672539d4'),
('mintToken','0x69f7c1e6'),
('mintToken','0x6aa0cfd7'),
('mintToken','0x6be01dfb'),
('mintToken','0x6bec32da'),
('mintToken','0x6dfada86'),
('mintToken','0x72a8e811'),
('mintToken','0x752312a9'),
('mintToken','0x76b4aac7'),
('mintToken','0x7811a5bf'),
('mintToken','0x79c65068'),
('mintToken','0x7d061c50'),
('mintToken','0x80abe7ea'),
('mintToken','0x8bf68690'),
('mintToken','0x96dad8c3'),
('mintToken','0x9ae1c4f8'),
('mintToken','0x9f12a91b'),
('mintToken','0xa140ae23'),
('mintToken','0xa510c88c'),
('mintToken','0xa521ad7c'),
('mintToken','0xa65b840c'),
('mintToken','0xad38c992'),
('mintToken','0xae7c122e'),
('mintToken','0xaeb8f966'),
('mintToken','0xaf68b302'),
('mintToken','0xb0e132f6'),
('mintToken','0xb3ed32b1'),
('mintToken','0xb4a8e0a9'),
('mintToken','0xb5a271d4'),
('mintToken','0xb7c97a3b'),
('mintToken','0xc046372c'),
('mintToken','0xc0e0d461'),
('mintToken','0xc347f4b3'),
('mintToken','0xc4387772'),
('mintToken','0xc634d032'),
('mintToken','0xc717e8ea'),
('mintToken','0xc8f863ec'),
('mintToken','0xcf4de65d'),
('mintToken','0xd0b7ca57'),
('mintToken','0xd890c8e2'),
('mintToken','0xede34bdd'),
('mintToken','0xf01b50df'),
('mintToken','0xf633be1e'),
('mintToken','0xf76e8ba9'),
('mintToken','0xf9058b52'),
('mintToken','0xfc8bc159'),
('mint','0x0bd06246'),
('mint','0x0bf220c0'),
('mint','0x0bf79099'),
('mint','0x0c1225b7'),
('mint','0x1b025a40'),
('mint','0x1b44372c'),
('mint','0x02a25b0a'),
('mint','0x02acc94b'),
('mint','0x038bd95a'),
('mint','0x09cb66c4'),
('mint','0x0c178b63'),
('mint','0x0c343186'),
('mint','0x156e29f6'),
('mint','0x15866b8f'),
('mint','0x158a4d5e'),
('mint','0x159a76bd'),
('mint','0x159ab14d'),
('mint','0x16fae0c4'),
('mint','0x1716d0f1'),
('mint','0x1746a5d2'),
('mint','0x1801fbe5'),
('mint','0x1b8bdb00'),
('mint','0x0182a111'),
('mint','0x01e65df1'),
('mint','0x021b98de'),
('mint','0x02341c71'),
('mint','0x056b01ce'),
('mint','0x059d45ff'),
('mint','0x05b6cb4f'),
('mint','0x065a2b07'),
('mint','0x09950b44'),
('mint','0x17cd6278'),
('mint','0x17e43be9'),
('mint','0x1a2e1dad'),
('mint','0x1a61224c'),
('mint','0x0d4878d4'),
('mint','0x0d4d1513'),
('mint','0x13d8867c'),
('mint','0x1612c581'),
('mint','0x168dbce8'),
('mint','0x1ba4fe2d'),
('mint','0x00ea81c0'),
('mint','0x0d2a3be0'),
('mint','0x10aec4a6'),
('mint','0x10c5dd88'),
('mint','0x18c41a80'),
('mint','0x18e6645c'),
('mint','0x1aead3aa'),
('mint','0x130db74d'),
('mint','0x13140ebe'),
('mint','0x1164ddd1'),
('mint','0x13508313'),
('mint','0x1175424d'),
('mint','0x1ae0d9b5'),
('mint','0x1b2ef1ca'),
('mint','0x11ed56c9'),
('mint','0x121a4ddf'),
('mint','0x12639f9f'),
('mint','0x127025a0'),
('mint','0x1249c58b'),
('mint','0x13b0cc39'),
('mint','0x00715318'),
('mint','0x0a181672'),
('mint','0x10603451'),
('mint','0x0b6042e4'),
('mint','0x1acebe08'),
('mint','0x1ac429b2'),
('mint','0x10662e91'),
('mint','0x076adbae'),
('mint','0x0ef808de'),
('mint','0x08dc9891'),
('mint','0x08dc9f42'),
('mint','0x089567e8'),
('mint','0x0de03df3'),
('mint','0x074ee446'),
('mint','0x14e4354a'),
('mint','0x0e445536'),
('mint','0x0e76c7a0'),
('mint','0x0da209c3'),
('mint','0x08a8d7aa'),
('mint','0x00257612'),
('mint','0x04c87d7b'),
('mint','0x0039a9b8'),
('mint','0x0d23d669'),
('mint','0x0d0eff89'),
('mint','0x0ae8f94f'),
('mint','0x1e458bee'),
('mint','0x1f1d81a5'),
('mint','0x1f3a3a53'),
('mint','0x1f466456'),
('mint','0x1f6278cf'),
('mint','0x1fcfe19c'),
('mint','0x1ff7712f'),
('mint','0x200f6e06'),
('mint','0x208c8692'),
('mint','0x2097d3fb'),
('mint','0x20d54971'),
('mint','0x20d558aa'),
('mint','0x20d7b327'),
('mint','0x2148199d'),
('mint','0x21a2b3ae'),
('mint','0x21c95eda'),
('mint','0x21e98b8a'),
('mint','0x2203bb8a'),
('mint','0x221375a6'),
('mint','0x2232d095'),
('mint','0x229ef11d'),
('mint','0x22b99cee'),
('mint','0x22c7437b'),
('mint','0x22f07ae8'),
('mint','0x23cf0a22'),
('mint','0x25b46e78'),
('mint','0x2678267b'),
('mint','0x26a73679'),
('mint','0x271589be'),
('mint','0x2715eb15'),
('mint','0x273e0d97'),
('mint','0x27521702'),
('mint','0x2799c6cf'),
('mint','0x27e8eae3'),
('mint','0x27ed628b'),
('mint','0x2893c5b0'),
('mint','0x289ea6a3'),
('mint','0x28cab2db'),
('mint','0x28fc3478'),
('mint','0x28fcc890'),
('mint','0x293c6a3a'),
('mint','0x2955a21d'),
('mint','0x29a0eee8'),
('mint','0x29c3b843'),
('mint','0x2adfefeb'),
('mint','0x2aedc3f9'),
('mint','0x2af1c247'),
('mint','0x2b1ccc9a'),
('mint','0x2baca4fb'),
('mint','0x2c58ae4e'),
('mint','0x2c8d3fa3'),
('mint','0x2cae7f4c'),
('mint','0x2cca3237'),
('mint','0x2cdbcbd1'),
('mint','0x2cdbf5d1'),
('mint','0x2cfd3005'),
('mint','0x2d1d70c0'),
('mint','0x2d3e9efe'),
('mint','0x2d69044f'),
('mint','0x2d942b7d'),
('mint','0x2db6e4c1'),
('mint','0x2e46dc67'),
('mint','0x2f6196b7'),
('mint','0x2fb102cf'),
('mint','0x301df4c6'),
('mint','0x30352066'),
('mint','0x30685a3c'),
('mint','0x31088cd4'),
('mint','0x310f4cdd'),
('mint','0x313dde92'),
('mint','0x31479776'),
('mint','0x3167611f'),
('mint','0x31934667'),
('mint','0x31b6475c'),
('mint','0x31fa3eb9'),
('mint','0x31feab29'),
('mint','0x33020312'),
('mint','0x336028eb'),
('mint','0x3383b258'),
('mint','0x34625823'),
('mint','0x34dfce94'),
('mint','0x352926a8'),
('mint','0x369d12c2'),
('mint','0x37420a88'),
('mint','0x375a54ab'),
('mint','0x1dceb223'),
('mint','0x1de77f91'),
('mint','0x1e01cd6d'),
('mint','0x1c7da278'),
('mint','0x1c635ded'),
('mint','0x1c351a9d'),
('mint','0x3866d8a4'),
('mint','0x392c00a2'),
('mint','0x3937b6f1'),
('mint','0x395dbd14'),
('mint','0x3a1460ac'),
('mint','0x3a913b21'),
('mint','0x3adbb3a4'),
('mint','0x3ba3518a'),
('mint','0x3bce2dcc'),
('mint','0x3bf8c173'),
('mint','0x3c173a4f'),
('mint','0x3c8a7d8d'),
('mint','0x3ca5528a'),
('mint','0x3cb064ba'),
('mint','0x3cfbf3be'),
('mint','0x3d5d190c'),
('mint','0x3dcce30f'),
('mint','0x3dd90430'),
('mint','0x3e5cacf3'),
('mint','0x3e5f2ebc'),
('mint','0x3e6eaa03'),
('mint','0x3edfd954'),
('mint','0x3eec705b'),
('mint','0x3f288cb8'),
('mint','0x3f9a93b2'),
('mint','0x3fdd555c'),
('mint','0x400e604c'),
('mint','0x40786dec'),
('mint','0x40a876de'),
('mint','0x40c10f19'),
('mint','0x419ef65b'),
('mint','0x41a145ad'),
('mint','0x422ca4b7'),
('mint','0x427dee38'),
('mint','0x42f2a854'),
('mint','0x43368405'),
('mint','0x437f045e'),
('mint','0x438e7c18'),
('mint','0x43b50825'),
('mint','0x4428d0a0'),
('mint','0x4472167b'),
('mint','0x44f5d0e0'),
('mint','0x45340a47'),
('mint','0x45de0d9b'),
('mint','0x4605cdb3'),
('mint','0x4644ddc7'),
('mint','0x4649df7d'),
('mint','0x46c1a4f2'),
('mint','0x472fad3a'),
('mint','0x4737576e'),
('mint','0x47c699d1'),
('mint','0x47e5260c'),
('mint','0x4853d8a5'),
('mint','0x499d1081'),
('mint','0x49bc990b'),
('mint','0x49d681d6'),
('mint','0x4a0706be'),
('mint','0x4a21a2df'),
('mint','0x4a47b4c2'),
('mint','0x4a8400de'),
('mint','0x4a9eee69'),
('mint','0x4b94a53f'),
('mint','0x4bf75e6e'),
('mint','0x4c7bc5cf'),
('mint','0x4cace359'),
('mint','0x4cad2f5e'),
('mint','0x4d54227c'),
('mint','0x4d722295'),
('mint','0x4da86cae'),
('mint','0x4e6cca8f'),
('mint','0x4ea91781'),
('mint','0x4ebf5cb3'),
('mint','0x4ed387b2'),
('mint','0x4ee571ce'),
('mint','0x4eeb381e'),
('mint','0x4f023d61'),
('mint','0x4f0792c9'),
('mint','0x4f099a95'),
('mint','0x4f0b20ac'),
('mint','0x4f30f09e'),
('mint','0x4f9f07f2'),
('mint','0x4fa53572'),
('mint','0x507ed31c'),
('mint','0x50e862db'),
('mint','0x510c0f3c'),
('mint','0x511fabb9'),
('mint','0x51416019'),
('mint','0x51843f1e'),
('mint','0x518a35e2'),
('mint','0x51f8c744'),
('mint','0x52555702'),
('mint','0x52bd9cf9'),
('mint','0x5386ee40'),
('mint','0x544476e5'),
('mint','0x546cec3e'),
('mint','0x5498b8a8'),
('mint','0x549d8449'),
('mint','0x54db6aa3'),
('mint','0x5535ff6d'),
('mint','0x55420de1'),
('mint','0x55fbf8e7'),
('mint','0x564e62e3'),
('mint','0x5768f271'),
('mint','0x597d78e1'),
('mint','0x5b0915df'),
('mint','0x5b2854af'),
('mint','0x5b4feb17'),
('mint','0x5b5b4711'),
('mint','0x5b5e9ae8'),
('mint','0x5b885ed7'),
('mint','0x5be57b6a'),
('mint','0x5c5b69a9'),
('mint','0x5ca5933a'),
('mint','0x5cb82274'),
('mint','0x5cbd027e'),
('mint','0x5e2a0023'),
('mint','0x5e371bce'),
('mint','0x5ebbf52e'),
('mint','0x5f257f29'),
('mint','0x5f2e29f7'),
('mint','0x5f3317a0'),
('mint','0x5f40f5c2'),
('mint','0x5f4bb80b'),
('mint','0x5f4f1c50'),
('mint','0x5f7c7af1'),
('mint','0x606d22bd'),
('mint','0x6112e8ac'),
('mint','0x612b9049'),
('mint','0x612bfba4'),
('mint','0x6169131c'),
('mint','0x6256833f'),
('mint','0x62f46d15'),
('mint','0x63185c42'),
('mint','0x631c1c5a'),
('mint','0x6391aec2'),
('mint','0x640fc181'),
('mint','0x641ce140'),
('mint','0x643183bf'),
('mint','0x650075a7'),
('mint','0x656c24b6'),
('mint','0x6582ccd3'),
('mint','0x66081331'),
('mint','0x669e0ac2'),
('mint','0x672644f6'),
('mint','0x672a9400'),
('mint','0x673cd401'),
('mint','0x67c7ec30'),
('mint','0x67f68fac'),
('mint','0x67f7397a'),
('mint','0x67fc19bb'),
('mint','0x68a397c0'),
('mint','0x691562a0'),
('mint','0x697b0b68'),
('mint','0x69d3e20e'),
('mint','0x69d5481b'),
('mint','0x6a4b8883'),
('mint','0x6a627842'),
('mint','0x6b1a2b7f'),
('mint','0x6b386df6'),
('mint','0x6bc63893'),
('mint','0x6bf2a62a'),
('mint','0x6c174ed8'),
('mint','0x6c4ffed2'),
('mint','0x6cc0cef6'),
('mint','0x6ccd077a'),
('mint','0x6cfb78ff'),
('mint','0x6d013618'),
('mint','0x6d0c606b'),
('mint','0x6d5f4559'),
('mint','0x6d693956'),
('mint','0x6ecd2306'),
('mint','0x6fa13699'),
('mint','0x6fbb4a35'),
('mint','0x6ffd16e7'),
('mint','0x70238eb2'),
('mint','0x706023c1'),
('mint','0x706ff617'),
('mint','0x70dca3d3'),
('mint','0x70f93ede'),
('mint','0x71027954'),
('mint','0x714c8592'),
('mint','0x7175cfab'),
('mint','0x71f43e3c'),
('mint','0x726f68e4'),
('mint','0x72c3015c'),
('mint','0x731133e9'),
('mint','0x7360ab6e'),
('mint','0x7375027c'),
('mint','0x73c02519'),
('mint','0x747bbfd5'),
('mint','0x74f9209c'),
('mint','0x7580d920'),
('mint','0x75f46d0f'),
('mint','0x75f64ae3'),
('mint','0x763df5d8'),
('mint','0x7649145c'),
('mint','0x76625865'),
('mint','0x76e61180'),
('mint','0x77097fc8'),
('mint','0x7718d83d'),
('mint','0x77370397'),
('mint','0x775beeb7'),
('mint','0x775ed63d'),
('mint','0x7763605e'),
('mint','0x77830dca'),
('mint','0x77f61403'),
('mint','0x785cc997'),
('mint','0x7877a3f5'),
('mint','0x78a9ba21'),
('mint','0x78df9b88'),
('mint','0x7964bce3'),
('mint','0x7a20b585'),
('mint','0x7a5f188a'),
('mint','0x7a65783e'),
('mint','0x7ad09dff'),
('mint','0x7af1388c'),
('mint','0x7b105717'),
('mint','0x7b4f5327'),
('mint','0x7b84c8ec'),
('mint','0x7b90cfcb'),
('mint','0x7ba0e2e7'),
('mint','0x7bf32270'),
('mint','0x7bf75f6c'),
('mint','0x7cc44b7c'),
('mint','0x7cd9de40'),
('mint','0x7d36d39c'),
('mint','0x7ddfffbf'),
('mint','0x7e0b4201'),
('mint','0x7e67a782'),
('mint','0x7e8816b9'),
('mint','0x7ed9db59'),
('mint','0x7f4780cc'),
('mint','0x7f614ab9'),
('mint','0x7fb9a063'),
('mint','0x7fbcc639'),
('mint','0x7fdfcd99'),
('mint','0x7fe7adfc'),
('mint','0x8023b297'),
('mint','0x8033491c'),
('mint','0x8096f319'),
('mint','0x80bcefab'),
('mint','0x8107eee4'),
('mint','0x811072de'),
('mint','0x81513892'),
('mint','0x81a1452c'),
('mint','0x820951fe'),
('mint','0x82408713'),
('mint','0x831936ef'),
('mint','0x83205a95'),
('mint','0x833f208d'),
('mint','0x83667fda'),
('mint','0x836a1040'),
('mint','0x83b0d7b3'),
('mint','0x843edd3c'),
('mint','0x84849ed3'),
('mint','0x84ba2642'),
('mint','0x84bc039c'),
('mint','0x84deb31e'),
('mint','0x8531db51'),
('mint','0x853d42ad'),
('mint','0x855d175e'),
('mint','0x85e4a9b4'),
('mint','0x85f89c7e'),
('mint','0x8606bc04'),
('mint','0x860cab13'),
('mint','0x86360c17'),
('mint','0x863ca149'),
('mint','0x875020be'),
('mint','0x8773ebd7'),
('mint','0x87a42642'),
('mint','0x88316456'),
('mint','0x88bfdfb4'),
('mint','0x8a1bbf86'),
('mint','0x8a9238db'),
('mint','0x8aa0fdad'),
('mint','0x8b097663'),
('mint','0x8b162dc1'),
('mint','0x8b3d35ae'),
('mint','0x8b46c7c4'),
('mint','0x8b6423ce'),
('mint','0x8b938a90'),
('mint','0x8c05a233'),
('mint','0x8cb75cad'),
('mint','0x8cebdad2'),
('mint','0x8d75533f'),
('mint','0x8dcd8745'),
('mint','0x8e145317'),
('mint','0x8e782bbb'),
('mint','0x8ea2347b'),
('mint','0x8f42403a'),
('mint','0x8ff45d93'),
('mint','0x904c5747'),
('mint','0x909ceb0e'),
('mint','0x918332c7'),
('mint','0x919dae26'),
('mint','0x9263e371'),
('mint','0x928e3caf'),
('mint','0x92daeac0'),
('mint','0x935c95d8'),
('mint','0x93830221'),
('mint','0x93cd14a0'),
('mint','0x9407375e'),
('mint','0x94259399'),
('mint','0x947b667b'),
('mint','0x94bf804d'),
('mint','0x94d008ef'),
('mint','0x958b569b'),
('mint','0x95c25200'),
('mint','0x95d6bd6c'),
('mint','0x95ef266f'),
('mint','0x966fc193'),
('mint','0x96760f62'),
('mint','0x96c7e963'),
('mint','0x96cd220c'),
('mint','0x96cf73cf'),
('mint','0x96f639ed'),
('mint','0x9727756a'),
('mint','0x973dfc55'),
('mint','0x97622870'),
('mint','0x98a34f24'),
('mint','0x98f3c325'),
('mint','0x98faf29b'),
('mint','0x99071190'),
('mint','0x995df2b2'),
('mint','0x9960194e'),
('mint','0x99c07391'),
('mint','0x99c1537f'),
('mint','0x99dfdb3e'),
('mint','0x9a255db6'),
('mint','0x9a3e4eb8'),
('mint','0x9ab475b5'),
('mint','0x9adffdc7'),
('mint','0x9bb24386'),
('mint','0x9bdfba06'),
('mint','0x9c205513'),
('mint','0x9c315924'),
('mint','0x9cbce419'),
('mint','0x9cc1a283'),
('mint','0x9ce20567'),
('mint','0x9ceeaca7'),
('mint','0x9df8493c'),
('mint','0x9e702901'),
('mint','0x9ec5cf5f'),
('mint','0x9f535821'),
('mint','0x9fb6c796'),
('mint','0x9fd9802c'),
('mint','0x9fe085d1'),
('mint','0xa0712d68'),
('mint','0xa0ecdb3f'),
('mint','0xa1ac0827'),
('mint','0xa1b175a1'),
('mint','0xa2026e3d'),
('mint','0xa230da05'),
('mint','0xa25ffea8'),
('mint','0xa2b0e857'),
('mint','0xa2dd9d87'),
('mint','0xa3574aaf'),
('mint','0xa3bf277e'),
('mint','0xa3e6dc28'),
('mint','0xa40d1b10'),
('mint','0xa4450587'),
('mint','0xa46a932f'),
('mint','0xa4b645eb'),
('mint','0xa53324b5'),
('mint','0xa555d1db'),
('mint','0xa6373fa0'),
('mint','0xa647e8ec'),
('mint','0xa6c93b4e'),
('mint','0xa6ed150e'),
('mint','0xa71bbebe'),
('mint','0xa76393ab'),
('mint','0xa80a611c'),
('mint','0xa81f2bb5'),
('mint','0xa8fea21a'),
('mint','0xa909fc56'),
('mint','0xa91aa9a8'),
('mint','0xaac48653'),
('mint','0xaaf8513a'),
('mint','0xaafdefd7'),
('mint','0xaafe29c0'),
('mint','0xaba276f7'),
('mint','0xabda8778'),
('mint','0xac4da5f5'),
('mint','0xacc8f306'),
('mint','0xacca6b31'),
('mint','0xacd379cc'),
('mint','0xacdd1454'),
('mint','0xad0be4bd'),
('mint','0xad193e10'),
('mint','0xad5ef41d'),
('mint','0xad60fb73'),
('mint','0xad7bafc7'),
('mint','0xad871846'),
('mint','0xadc042bf'),
('mint','0xadf2cead'),
('mint','0xae125f00'),
('mint','0xae3dfa28'),
('mint','0xaeef6719'),
('mint','0xaf131f50'),
('mint','0xaf255b61'),
('mint','0xaf481be8'),
('mint','0xb00100fa'),
('mint','0xb1282c2d'),
('mint','0xb154d6e9'),
('mint','0xb2410c02'),
('mint','0xb2964b91'),
('mint','0xb29f8f32'),
('mint','0xb34912d7'),
('mint','0xb350ac45'),
('mint','0xb35cc186'),
('mint','0xb39ae905'),
('mint','0xb3b34f99'),
('mint','0xb3f1c93d'),
('mint','0xb465ffe9'),
('mint','0xb49c99b8'),
('mint','0xb4c025d9'),
('mint','0xb4dc877e'),
('mint','0xb4ed72fb'),
('mint','0xb510391f'),
('mint','0xb51b6971'),
('mint','0xb55f92b2'),
('mint','0xb5e73249'),
('mint','0xb61c5e69'),
('mint','0xb62d5b4e'),
('mint','0xb6c32074'),
('mint','0xb774cf90'),
('mint','0xb77a147b'),
('mint','0xb7c754da'),
('mint','0xb7e2a06c'),
('mint','0xb826e087'),
('mint','0xb841d2d2'),
('mint','0xb8438881'),
('mint','0xb85cbc79'),
('mint','0xb91ca622'),
('mint','0xb93b756b'),
('mint','0xb9578eff'),
('mint','0xb96a07de'),
('mint','0xb9a918ce'),
('mint','0xb9dacaf3'),
('mint','0xb9e0a291'),
('mint','0xba365d7e'),
('mint','0xba41b0c6'),
('mint','0xba4ad5ac'),
('mint','0xba7aef43'),
('mint','0xbaa37a24'),
('mint','0xbaba12a3'),
('mint','0xbb424369'),
('mint','0xbb7fde71'),
('mint','0xbbf2a8c6'),
('mint','0xbbfcf060'),
('mint','0xbce4aa39'),
('mint','0xbd075b84'),
('mint','0xbd5379f9'),
('mint','0xbd7c27e0'),
('mint','0xbdbaae63'),
('mint','0xbdc01110'),
('mint','0xbe29184f'),
('mint','0xbe8c5922'),
('mint','0xbf2c8a94'),
('mint','0xbf6caa4b'),
('mint','0xbff14ee4'),
('mint','0xc0035b2a'),
('mint','0xc014875f'),
('mint','0xc0555c8d'),
('mint','0xc061ddc7'),
('mint','0xc177e6f6'),
('mint','0xc1f2fa69'),
('mint','0xc2b55c8c'),
('mint','0xc4b71c88'),
('mint','0xc4bab469'),
('mint','0xc4db3fc0'),
('mint','0xc50a4eb9'),
('mint','0xc60b6626'),
('mint','0xc61e42ae'),
('mint','0xc6250b34'),
('mint','0xc6426bfc'),
('mint','0xc6bf3262'),
('mint','0xc6c3bbe6'),
('mint','0xc6e64e53'),
('mint','0xc75986ee'),
('mint','0xc77b66c2'),
('mint','0xc7d2d366'),
('mint','0xc7daf487'),
('mint','0xc89dcfce'),
('mint','0xc8a88c5a'),
('mint','0xc8ceaa95'),
('mint','0xc8fb113e'),
('mint','0xc9580bca'),
('mint','0xc971e428'),
('mint','0xc9b34ce2'),
('mint','0xca1daf88'),
('mint','0xca3181e0'),
('mint','0xcacd07a7'),
('mint','0xcb49c209'),
('mint','0xcb5a7173'),
('mint','0xcbbb20a4'),
('mint','0xcbbf42c1'),
('mint','0xcc3e20df'),
('mint','0xcc8a459f'),
('mint','0xcd076620'),
('mint','0xcd26c64b'),
('mint','0xcd2ba3ad'),
('mint','0xcd4687e9'),
('mint','0xcdf46344'),
('mint','0xcdf7b4e8'),
('mint','0xcdff735e'),
('mint','0xce8a2b4d'),
('mint','0xceb40e92'),
('mint','0xcf050474'),
('mint','0xcf21977c'),
('mint','0xcf237fc0'),
('mint','0xcf5bf412'),
('mint','0xcf755689'),
('mint','0xcfa84fc1'),
('mint','0xcfb13e65'),
('mint','0xd0047acf'),
('mint','0xd049b095'),
('mint','0xd05b42cb'),
('mint','0xd06a8e88'),
('mint','0xd0def521'),
('mint','0xd10e99fe'),
('mint','0xd113cc80'),
('mint','0xd1a1beb4'),
('mint','0xd1cb7561'),
('mint','0xd20e4874'),
('mint','0xd2b04fd6'),
('mint','0xd2e24965'),
('mint','0xd34047b6'),
('mint','0xd35827a6'),
('mint','0xd35e29d7'),
('mint','0xd35f4a99'),
('mint','0xd3aeea60'),
('mint','0xd3b9ff7f'),
('mint','0xd3d62b79'),
('mint','0xd3dbcd2a'),
('mint','0xd3fc9864'),
('mint','0xd46e174d'),
('mint','0xd4bf51a7'),
('mint','0xd55181b0'),
('mint','0xd589cac7'),
('mint','0xd612f7f9'),
('mint','0xd645ddf6'),
('mint','0xd65bd616'),
('mint','0xd689511f'),
('mint','0xd6b96050'),
('mint','0xd6d12c40'),
('mint','0xd6f69d29'),
('mint','0xd77fe8b2'),
('mint','0xd847adf6'),
('mint','0xd85d3d27'),
('mint','0xd868d852'),
('mint','0xd895ea52'),
('mint','0xd8f361ad'),
('mint','0xd998b15a'),
('mint','0xd99e0f0a'),
('mint','0xda0f462d'),
('mint','0xda14cbbc'),
('mint','0xda39b3e7'),
('mint','0xda41bfe1'),
('mint','0xda4ee5d2'),
('mint','0xda662fff'),
('mint','0xdabb57ca'),
('mint','0xdada81cc'),
('mint','0xdaefb20c'),
('mint','0xdb29c934'),
('mint','0xdb4726ec'),
('mint','0xdb4c9e2f'),
('mint','0xdb7fd408'),
('mint','0xdbecbf59'),
('mint','0xdbf110a7'),
('mint','0xdc214055'),
('mint','0xdc4c7ca9'),
('mint','0xdc56fe9d'),
('mint','0xdc710737'),
('mint','0xdca5feeb'),
('mint','0xdca7841a'),
('mint','0xdcd29950'),
('mint','0xdcdc7dd0'),
('mint','0xdd0bbf96'),
('mint','0xdd1ccc86'),
('mint','0xdd2f1652'),
('mint','0xdd40e2e1'),
('mint','0xdd571ac5'),
('mint','0xdd6c8724'),
('mint','0xddcf36d3'),
('mint','0xdddde23a'),
('mint','0xde26648a'),
('mint','0xde836ebd'),
('mint','0xdf08b714'),
('mint','0xdf45ee5a'),
('mint','0xdf636ea0'),
('mint','0xdfa31782'),
('mint','0xdfc8fff6'),
('mint','0xdfe7a8e5'),
('mint','0xdfefc776'),
('mint','0xdffe9fa1'),
('mint','0xdfff85a4'),
('mint','0xe0ac2b46'),
('mint','0xe0e0daea'),
('mint','0xe1593d74'),
('mint','0xe184bad0'),
('mint','0xe1856ff4'),
('mint','0xe19fd1af'),
('mint','0xe205918d'),
('mint','0xe2242b95'),
('mint','0xe2b6e72e'),
('mint','0xe2babcec'),
('mint','0xe2cd62d1'),
('mint','0xe2d64176'),
('mint','0xe2efc805'),
('mint','0xe3255d16'),
('mint','0xe37b566e'),
('mint','0xe467f7e0'),
('mint','0xe575c3dc'),
('mint','0xe5c95719'),
('mint','0xe5e3c1f9'),
('mint','0xe6153d1b'),
('mint','0xe626840e'),
('mint','0xe64e3241'),
('mint','0xe66826fe'),
('mint','0xe67bc8da'),
('mint','0xe67e402c'),
('mint','0xe6d37b88'),
('mint','0xe6e01b3f'),
('mint','0xe6f12af9'),
('mint','0xe7bf0f1d'),
('mint','0xe7d3fe6b'),
('mint','0xe7e04aa5'),
('mint','0xe809945b'),
('mint','0xe86ad08c'),
('mint','0xe86f6367'),
('mint','0xe8c9a3b3'),
('mint','0xe8cbe175'),
('mint','0xe9125120'),
('mint','0xe97272ec'),
('mint','0xe9bca719'),
('mint','0xe9c927ce'),
('mint','0xe9eb7008'),
('mint','0xea540632'),
('mint','0xea66696c'),
('mint','0xeab77cfc'),
('mint','0xeb163b72'),
('mint','0xeb1a1ba1'),
('mint','0xeb22ed32'),
('mint','0xeb381429'),
('mint','0xeb44fea4'),
('mint','0xeb9e0398'),
('mint','0xebacc479'),
('mint','0xecb2906c'),
('mint','0xeccb2479'),
('mint','0xecf4d60f'),
('mint','0xed0b4cdc'),
('mint','0xed2e8bc7'),
('mint','0xedb08434'),
('mint','0xede7e85a'),
('mint','0xee04e623'),
('mint','0xee1fe2ad'),
('mint','0xee320d61'),
('mint','0xee5301d5'),
('mint','0xee7242e3'),
('mint','0xee9ff07d'),
('mint','0xeeb73071'),
('mint','0xeebab8ef'),
('mint','0xef3d76a5'),
('mint','0xef413652'),
('mint','0xef5f5c0e'),
('mint','0xef60e3b1'),
('mint','0xefacd939'),
('mint','0xefb6b11f'),
('mint','0xf0062203'),
('mint','0xf05fb609'),
('mint','0xf0c2d915'),
('mint','0xf0cc52a0'),
('mint','0xf0dad05d'),
('mint','0xf11c801c'),
('mint','0xf1aa8cb8'),
('mint','0xf262c2aa'),
('mint','0xf26748e2'),
('mint','0xf2731f4a'),
('mint','0xf35b59f5'),
('mint','0xf37b4ee5'),
('mint','0xf382555e'),
('mint','0xf41bfa9e'),
('mint','0xf45bebc9'),
('mint','0xf47688f2'),
('mint','0xf492741e'),
('mint','0xf4add0af'),
('mint','0xf4cb505c'),
('mint','0xf5dd24ea'),
('mint','0xf6030aeb'),
('mint','0xf6d7e1f8'),
('mint','0xf721b169'),
('mint','0xf74bfe8e'),
('mint','0xf81731e5'),
('mint','0xf84f2664'),
('mint','0xf85f447b'),
('mint','0xf8734302'),
('mint','0xf8e93ef9'),
('mint','0xf8ea8f16'),
('mint','0xf92883a2'),
('mint','0xf9d7b425'),
('mint','0xfa28d692'),
('mint','0xfa2a94ef'),
('mint','0xfa2b068f'),
('mint','0xfa8509c8'),
('mint','0xfae90307'),
('mint','0xfaf33518'),
('mint','0xfb1c9b92'),
('mint','0xfb2f1ffb'),
('mint','0xfb9d09c8'),
('mint','0xfbbf01ef'),
('mint','0xfbc56406'),
('mint','0xfc1cc1d1'),
('mint','0xfc618071'),
('mint','0xfca8f152'),
('mint','0xfd1c0657'),
('mint','0xfd66ea1b'),
('mint','0xfd8bf596'),
('mint','0xfd9bf3aa'),
('mint','0xfe02ff3f'),
('mint','0xfe1ca4d6'),
('mint','0xfe23245a'),
('mint','0xfe31f9ab'),
('mint','0xfe786ee6'),
('mint','0xff5effc0'),
('mint','0xffd4397e');