From 7345fa7421958c3488dfcf7149dd3626483d217c Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 2 Jul 2024 09:09:42 -0400 Subject: [PATCH 01/36] wip and e2e tests yaml --- .github/workflows/e2e.yaml | 28 ++++++++++++++++++++++++++++ cmd/masa-node/main.go | 2 +- pkg/chain/block.go | 2 +- pkg/config/welcome.go | 22 ++++++++++------------ pkg/tests/scraped_tweets.json | 1 + 5 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/e2e.yaml create mode 100644 pkg/tests/scraped_tweets.json diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml new file mode 100644 index 00000000..a08b16f9 --- /dev/null +++ b/.github/workflows/e2e.yaml @@ -0,0 +1,28 @@ +name: Go + +on: + push: + branches: + - test + pull_request: + branches: + - test + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: '^1.22' + + - name: Install dependencies + run: go mod tidy + + - name: Run tests + run: go test ./... \ No newline at end of file diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 72ba6414..a053a22b 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -89,7 +89,7 @@ func main() { // Init cache resolver go db.InitResolverCache(node, keyManager) // Subscribe to blocks -- moving to new ticket - // go masa.SubscribeToBlocks(ctx, node) + go masa.SubscribeToBlocks(ctx, node) // Subscribe and if actor start monitoring actor workers // considering all that matters is if the node is staked diff --git a/pkg/chain/block.go b/pkg/chain/block.go index 984c7630..edebeca5 100644 --- a/pkg/chain/block.go +++ b/pkg/chain/block.go @@ -13,7 +13,7 @@ type Block struct { Data []byte // this block's data Hash []byte // this block's hash Link []byte // the hash of the last block in the chain. this is the key part that links the blocks together - Nonce int64 // the nonce used to sing the block. useful for verification + Nonce int64 // the nonce used to sing the block for verification } func (b *Block) Build(data []byte, link []byte, stake *big.Int) { diff --git a/pkg/config/welcome.go b/pkg/config/welcome.go index 89f83367..b26d3010 100644 --- a/pkg/config/welcome.go +++ b/pkg/config/welcome.go @@ -6,10 +6,8 @@ import ( func DisplayWelcomeMessage(multiAddr, ipAddr, publicKeyHex string, isStaked bool, isValidator bool, isTwitterScraper bool, isDiscordScraper bool, isWebScraper bool, version string) { // ANSI escape code for yellow text - green := "\033[32m" yellow := "\033[33m" blue := "\033[34m" - // red := "\033[31m" reset := "\033[0m" fmt.Println("") @@ -24,15 +22,15 @@ func DisplayWelcomeMessage(multiAddr, ipAddr, publicKeyHex string, isStaked bool fmt.Println(yellow + "# #" + reset) fmt.Println(yellow + borderLine + reset) fmt.Println("") - fmt.Printf(green+"Version: %s\n"+reset, version) - // Displaying the multi-address and IP address in blue - fmt.Printf(blue+"Multiaddress: %s\n"+reset, multiAddr) - fmt.Printf(blue+"IP Address: %s\n"+reset, ipAddr) - fmt.Printf(blue+"Public Key: %s\n"+reset, publicKeyHex) - fmt.Printf(blue+"Is Staked: %t\n"+reset, isStaked) - fmt.Printf(blue+"Is Validator: %t\n"+reset, isValidator) - fmt.Printf(blue+"Is TwitterScraper: %t\n"+reset, isTwitterScraper) - fmt.Printf(blue+"Is DiscordScraper: %t\n"+reset, isDiscordScraper) - fmt.Printf(blue+"Is WebScraper: %t\n"+reset, isWebScraper) + + fmt.Printf(blue+"%-20s %s\n"+reset, "Version:", yellow+version) + fmt.Printf(blue+"%-20s %s\n"+reset, "Multiaddress:", multiAddr) + fmt.Printf(blue+"%-20s %s\n"+reset, "IP Address:", ipAddr) + fmt.Printf(blue+"%-20s %s\n"+reset, "Public Key:", publicKeyHex) + fmt.Printf(blue+"%-20s %t\n"+reset, "Is Staked:", isStaked) + fmt.Printf(blue+"%-20s %t\n"+reset, "Is Validator:", isValidator) + fmt.Printf(blue+"%-20s %t\n"+reset, "Is TwitterScraper:", isTwitterScraper) + fmt.Printf(blue+"%-20s %t\n"+reset, "Is DiscordScraper:", isDiscordScraper) + fmt.Printf(blue+"%-20s %t\n"+reset, "Is WebScraper:", isWebScraper) fmt.Println("") } diff --git a/pkg/tests/scraped_tweets.json b/pkg/tests/scraped_tweets.json new file mode 100644 index 00000000..3df61677 --- /dev/null +++ b/pkg/tests/scraped_tweets.json @@ -0,0 +1 @@ +[{"ConversationID":"1807802687905255627","GIFs":null,"Hashtags":["AI"],"HTML":"Success! I just bridged tokens to the Masa AI Data Network and it was super easy. Transfer tokens to or from ETH or BNB to the Masa Network, and start earning $MASA token rewards in the \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/AI\"\u003e#AI\u003c/a\u003e marketplace. \u003ca href=\"https://app.masa.finance/bridge\"\u003ehttps://t.co/rYuTTHMdDY\u003c/a\u003e","ID":"1807802687905255627","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"0xPsyke","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/Psykepro/status/1807802687905255627","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Success! I just bridged tokens to the Masa AI Data Network and it was super easy. Transfer tokens to or from ETH or BNB to the Masa Network, and start earning $MASA token rewards in the @getmasafi #AI marketplace. https://t.co/rYuTTHMdDY","Thread":null,"TimeParsed":"2024-07-01T15:45:22Z","Timestamp":1719848722,"URLs":["https://app.masa.finance/bridge"],"UserID":"1083537859","Username":"Psykepro","Videos":null,"Views":9,"SensitiveContent":false},{"ConversationID":"1807696941083431215","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/SKMJVtiDNE\u003c/a\u003e","ID":"1807696941083431215","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"π•Έπ–Œπ•Άπ–π–†π•Ή","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/mgkhan2011/status/1807696941083431215","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/SKMJVtiDNE","Thread":null,"TimeParsed":"2024-07-01T08:45:10Z","Timestamp":1719823510,"URLs":["http://app.masa.ai/staking"],"UserID":"432452798","Username":"mgkhan2011","Videos":null,"Views":9,"SensitiveContent":false},{"ConversationID":"1807680816484630630","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e \u003ca href=\"https://twitter.com/chainlink\"\u003e@chainlink\u003c/a\u003e Exciting partnership πŸŽ‰πŸŽ‰\u003cbr\u003e$Masa to the moon πŸŒ’","ID":"1807685015204921553","InReplyToStatus":null,"InReplyToStatusID":"1807680816484630630","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"King Chris πŸ‘‘","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"},{"ID":"1530530365","Username":"chainlink","Name":"Chainlink"}],"PermanentURL":"https://twitter.com/KingChris40TH/status/1807685015204921553","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa @chainlink Exciting partnership πŸŽ‰πŸŽ‰\n$Masa to the moon πŸŒ’","Thread":null,"TimeParsed":"2024-07-01T07:57:47Z","Timestamp":1719820667,"URLs":null,"UserID":"1733325979102175232","Username":"KingChris40TH","Videos":null,"Views":16,"SensitiveContent":false},{"ConversationID":"1807389458020421797","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Good Morning $masa πŸ€—β˜•οΈ","ID":"1807489181939073415","InReplyToStatus":null,"InReplyToStatusID":"1807486379401879633","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"β€’β—‰ π•„π•€π•π• π•‚π•Ÿπ• π•¨π•€.𝕖π•₯𝕙 β—‰β€’","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/AlchemiDream/status/1807489181939073415","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Good Morning $masa πŸ€—β˜•οΈ","Thread":null,"TimeParsed":"2024-06-30T18:59:37Z","Timestamp":1719773977,"URLs":null,"UserID":"1470873270761238528","Username":"AlchemiDream","Videos":null,"Views":11,"SensitiveContent":false},{"ConversationID":"1807420173663469597","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1807420173663469597","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1807420173663469597","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-30T14:25:24Z","Timestamp":1719757524,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":89,"SensitiveContent":false},{"ConversationID":"1807420069766390002","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1807420069766390002","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1807420069766390002","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-30T14:24:59Z","Timestamp":1719757499,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":73,"SensitiveContent":false},{"ConversationID":"1807419994420171260","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1807419994420171260","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1807419994420171260","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-30T14:24:41Z","Timestamp":1719757481,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":76,"SensitiveContent":false},{"ConversationID":"1807360093299626417","GIFs":null,"Hashtags":["AI"],"HTML":"Success! I just bridged tokens to the Masa AI Data Network and it was super easy. Transfer tokens to or from ETH or BNB to the Masa Network, and start earning $MASA token rewards in the \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/AI\"\u003e#AI\u003c/a\u003e marketplace. \u003ca href=\"https://app.masa.finance/bridge\"\u003ehttps://t.co/25OKE1lbUW\u003c/a\u003e","ID":"1807360093299626417","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Vlad_i_mir.soul","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/BotnarVP/status/1807360093299626417","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Success! I just bridged tokens to the Masa AI Data Network and it was super easy. Transfer tokens to or from ETH or BNB to the Masa Network, and start earning $MASA token rewards in the @getmasafi #AI marketplace. https://t.co/25OKE1lbUW","Thread":null,"TimeParsed":"2024-06-30T10:26:40Z","Timestamp":1719743200,"URLs":["https://app.masa.finance/bridge"],"UserID":"1381674151186948096","Username":"BotnarVP","Videos":null,"Views":29,"SensitiveContent":false},{"ConversationID":"1807137496599597418","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1807137496599597418","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1807137496599597418","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-29T19:42:08Z","Timestamp":1719690128,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":97,"SensitiveContent":false},{"ConversationID":"1807137383097524603","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1807137383097524603","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1807137383097524603","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-29T19:41:41Z","Timestamp":1719690101,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":86,"SensitiveContent":false},{"ConversationID":"1807137275006132665","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1807137275006132665","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1807137275006132665","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-29T19:41:16Z","Timestamp":1719690076,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":95,"SensitiveContent":false},{"ConversationID":"1807079797178110249","GIFs":null,"Hashtags":null,"HTML":"~13 tokens launches on \u003ca href=\"https://twitter.com/CoinList\"\u003e@CoinList\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eonly 6 completed tge:\u003cbr\u003e\u003cbr\u003ereturn figures for the tge tokens:\u003cbr\u003e\u003cbr\u003e$tst: -40%\u003cbr\u003e$xzk: -53%\u003cbr\u003e$masa: +14%\u003cbr\u003e$msn: -66%\u003cbr\u003e$nibi: +108%\u003cbr\u003e$sqd: +14%\u003cbr\u003e\u003cbr\u003ebest performer: $nibi is down -68% over the past 3 months. $tap not launching yet is good. study \u003ca href=\"https://twitter.com/tap_protocol\"\u003e@tap_protocol\u003c/a\u003e","ID":"1807079797178110249","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":20,"Name":"Abdul","Mentions":[{"ID":"866047997456658434","Username":"CoinList","Name":"CoinList"},{"ID":"1688959801030586377","Username":"tap_protocol","Name":"Tap Protocol"}],"PermanentURL":"https://twitter.com/assafcapital/status/1807079797178110249","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":1,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"~13 tokens launches on @CoinList\n\nonly 6 completed tge:\n\nreturn figures for the tge tokens:\n\n$tst: -40%\n$xzk: -53%\n$masa: +14%\n$msn: -66%\n$nibi: +108%\n$sqd: +14%\n\nbest performer: $nibi is down -68% over the past 3 months. $tap not launching yet is good. study @tap_protocol","Thread":null,"TimeParsed":"2024-06-29T15:52:52Z","Timestamp":1719676372,"URLs":null,"UserID":"1778563406670303232","Username":"assafcapital","Videos":null,"Views":2578,"SensitiveContent":false},{"ConversationID":"1806681746299060565","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e GM $MASA β˜€οΈ\u003cbr\u003e\u003cbr\u003eLet’s get that bag!","ID":"1807067928128324012","InReplyToStatus":null,"InReplyToStatusID":"1807017418260373871","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"JC","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/iamJc/status/1807067928128324012","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa GM $MASA β˜€οΈ\n\nLet’s get that bag!","Thread":null,"TimeParsed":"2024-06-29T15:05:42Z","Timestamp":1719673542,"URLs":null,"UserID":"85007019","Username":"iamJc","Videos":null,"Views":16,"SensitiveContent":false},{"ConversationID":"1806966113516818685","GIFs":null,"Hashtags":["AI"],"HTML":"Success! I just bridged tokens to the Masa AI Data Network and it was super easy. Transfer tokens to or from ETH or BNB to the Masa Network, and start earning $MASA token rewards in the \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/AI\"\u003e#AI\u003c/a\u003e marketplace. \u003ca href=\"https://app.masa.finance/bridge\"\u003ehttps://t.co/25OKE1lbUW\u003c/a\u003e","ID":"1806966113516818685","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Vlad_i_mir.soul","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/BotnarVP/status/1806966113516818685","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Success! I just bridged tokens to the Masa AI Data Network and it was super easy. Transfer tokens to or from ETH or BNB to the Masa Network, and start earning $MASA token rewards in the @getmasafi #AI marketplace. https://t.co/25OKE1lbUW","Thread":null,"TimeParsed":"2024-06-29T08:21:07Z","Timestamp":1719649267,"URLs":["https://app.masa.finance/bridge"],"UserID":"1381674151186948096","Username":"BotnarVP","Videos":null,"Views":22,"SensitiveContent":false},{"ConversationID":"1806930111691657500","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/UOOAH5h5tx\u003c/a\u003e","ID":"1806930111691657500","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Bulgy Bear OG | sventar.soul","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/Ben26975651/status/1806930111691657500","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/UOOAH5h5tx","Thread":null,"TimeParsed":"2024-06-29T05:58:04Z","Timestamp":1719640684,"URLs":["http://app.masa.ai/staking"],"UserID":"1593479002357997568","Username":"Ben26975651","Videos":null,"Views":53,"SensitiveContent":false},{"ConversationID":"1806358430015541728","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1806358430015541728","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1806358430015541728","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-27T16:06:24Z","Timestamp":1719504384,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":123,"SensitiveContent":false},{"ConversationID":"1806358338432884999","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1806358338432884999","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1806358338432884999","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-27T16:06:03Z","Timestamp":1719504363,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":111,"SensitiveContent":false},{"ConversationID":"1806358244761424246","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1806358244761424246","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1806358244761424246","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-27T16:05:40Z","Timestamp":1719504340,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":76,"SensitiveContent":false},{"ConversationID":"1805843297409122804","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e gm $MASA πŸ’š","ID":"1805950934725353835","InReplyToStatus":null,"InReplyToStatusID":"1805903698616537573","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"casinokrisa","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/casinokrisa_x/status/1805950934725353835","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa gm $MASA πŸ’š","Thread":null,"TimeParsed":"2024-06-26T13:07:10Z","Timestamp":1719407230,"URLs":null,"UserID":"84417426","Username":"casinokrisa_x","Videos":null,"Views":7,"SensitiveContent":false},{"ConversationID":"1805873635384869018","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Goooooooood Morning $MASA \u003cbr\u003eHope you enjoy your Wednesday","ID":"1805918601955676573","InReplyToStatus":null,"InReplyToStatusID":"1805904787055005832","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Ale","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/alessatrx/status/1805918601955676573","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Goooooooood Morning $MASA \nHope you enjoy your Wednesday","Thread":null,"TimeParsed":"2024-06-26T10:58:41Z","Timestamp":1719399521,"URLs":null,"UserID":"1397195077571817476","Username":"alessatrx","Videos":null,"Views":31,"SensitiveContent":false},{"ConversationID":"1805813990691319872","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Gm $MASA","ID":"1805904421458489498","InReplyToStatus":null,"InReplyToStatusID":"1805903875393851567","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Audazity 🦁","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/audazityNFT/status/1805904421458489498","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Gm $MASA","Thread":null,"TimeParsed":"2024-06-26T10:02:20Z","Timestamp":1719396140,"URLs":null,"UserID":"2953635658","Username":"audazityNFT","Videos":null,"Views":18,"SensitiveContent":false},{"ConversationID":"1805607464319983938","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Gm $MASA βœŒπŸ½β˜€οΈ","ID":"1805698132833190329","InReplyToStatus":null,"InReplyToStatusID":"1805679348722418095","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Audazity 🦁","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/audazityNFT/status/1805698132833190329","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Gm $MASA βœŒπŸ½β˜€οΈ","Thread":null,"TimeParsed":"2024-06-25T20:22:37Z","Timestamp":1719346957,"URLs":null,"UserID":"2953635658","Username":"audazityNFT","Videos":null,"Views":20,"SensitiveContent":false},{"ConversationID":"1805589166748582311","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e \u003ca href=\"https://twitter.com/doginaldogsx\"\u003e@doginaldogsx\u003c/a\u003e Gmgm $MASA","ID":"1805689408034947399","InReplyToStatus":null,"InReplyToStatusID":"1805678038144925798","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Swede","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"},{"ID":"1659130914746806272","Username":"doginaldogsx","Name":"Doginal Dogs"}],"PermanentURL":"https://twitter.com/xGreenSwede/status/1805689408034947399","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa @doginaldogsx Gmgm $MASA","Thread":null,"TimeParsed":"2024-06-25T19:47:57Z","Timestamp":1719344877,"URLs":null,"UserID":"1758201881040388096","Username":"xGreenSwede","Videos":null,"Views":7,"SensitiveContent":false},{"ConversationID":"1805606026596794805","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1805606026596794805","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1805606026596794805","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-25T14:16:37Z","Timestamp":1719324997,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":106,"SensitiveContent":false},{"ConversationID":"1805605907050774757","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1805605907050774757","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1805605907050774757","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-25T14:16:09Z","Timestamp":1719324969,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":90,"SensitiveContent":false},{"ConversationID":"1805605822464245813","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1805605822464245813","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1805605822464245813","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-25T14:15:49Z","Timestamp":1719324949,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":87,"SensitiveContent":false},{"ConversationID":"1805245340032876732","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/mat_rash38998\"\u003e@mat_rash38998\u003c/a\u003e \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e $MASA utility keeps growing, been ranked on top trading Token","ID":"1805498854172659818","InReplyToStatus":null,"InReplyToStatusID":"1805245340032876732","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Startling","Mentions":[{"ID":"1672507408596213767","Username":"mat_rash38998","Name":"Mat Rash ⚑"},{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/RealLifu/status/1805498854172659818","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@mat_rash38998 @getmasafi $MASA utility keeps growing, been ranked on top trading Token","Thread":null,"TimeParsed":"2024-06-25T07:10:46Z","Timestamp":1719299446,"URLs":null,"UserID":"1487793065737740288","Username":"RealLifu","Videos":null,"Views":32,"SensitiveContent":false},{"ConversationID":"1805389130940944834","GIFs":null,"Hashtags":["MASA"],"HTML":"Frens! Apuesten sus tokens $MASA y ganen hasta un 25% APY en recompensas \u003ca href=\"https://twitter.com/hashtag/MASA\"\u003e#MASA\u003c/a\u003e 🧡‡️\u003cbr\u003e\u003cbr\u003eSolo elijan su periodo de bloqueo y empiecen a ganar, es fΓ‘cil y perfecto para cuando el mercado estΓ‘ tranquilo...🍻\u003cbr\u003e\u003cbr\u003e▢️Staken ahora: \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/MbgSUaYZj8\u003c/a\u003e \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003cbr\u003e\u003cbr\u003e-- \u003cbr\u003e\u003ca href=\"https://t.co/7jALdMpETm\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GQ4F2klW4AAbG0J.jpg\"/\u003e\u003c/a\u003e\u003cbr\u003e\u003cimg src=\"https://pbs.twimg.com/media/GQ4HfVhXUAA65F1.jpg\"/\u003e","ID":"1805389130940944834","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Alejandrπ•Žβ‚ƒβ„’ ⚑","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/ArmentSK_/status/1805389130940944834","Photos":[{"ID":"1805386935713587200","URL":"https://pbs.twimg.com/media/GQ4F2klW4AAbG0J.jpg"},{"ID":"1805388735556571136","URL":"https://pbs.twimg.com/media/GQ4HfVhXUAA65F1.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":1,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Frens! Apuesten sus tokens $MASA y ganen hasta un 25% APY en recompensas #MASA 🧡‡️\n\nSolo elijan su periodo de bloqueo y empiecen a ganar, es fΓ‘cil y perfecto para cuando el mercado estΓ‘ tranquilo...🍻\n\n▢️Staken ahora: https://t.co/MbgSUaYZj8 @getmasafi \n\n-- https://t.co/7jALdMpETm","Thread":null,"TimeParsed":"2024-06-24T23:54:45Z","Timestamp":1719273285,"URLs":["http://app.masa.ai/staking"],"UserID":"1194215548651032576","Username":"ArmentSK_","Videos":null,"Views":1144,"SensitiveContent":false},{"ConversationID":"1804900533737808074","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1804900533737808074","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1804900533737808074","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-23T15:33:15Z","Timestamp":1719156795,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":99,"SensitiveContent":false},{"ConversationID":"1804900466561876440","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1804900466561876440","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1804900466561876440","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-23T15:32:59Z","Timestamp":1719156779,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":71,"SensitiveContent":false},{"ConversationID":"1804783427989753901","GIFs":null,"Hashtags":null,"HTML":"Hello my lovely Masanauts πŸ§‘β€πŸš€πŸ™ŒπŸš€πŸŒ•πŸŒŒπŸͺ\u003cbr\u003edon't forget to stake your $MASA tokens on \u003cbr\u003e\u003ca href=\"https://app.masa.finance/staking\"\u003ehttps://t.co/JqWD5vbmBJ\u003c/a\u003e. and\u003cbr\u003eget your $MASA staked tokens worked for a long run vision and bonus. \u003cbr\u003eAlmost 9,508,941 token staked at the time.\u003cbr\u003eFollow \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e for future innovational updates. \u003cbr\u003e\u003ca href=\"https://t.co/uPWs2Ci6Hl\"\u003e\u003cimg src=\"https://pbs.twimg.com/ext_tw_video_thumb/1804781709818200064/pu/img/CDl1kFuOtb0_B5xd.jpg\"/\u003e\u003c/a\u003e","ID":"1804783427989753901","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"King PingzπŸ‘‘","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/Pingzkp/status/1804783427989753901","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":1,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Hello my lovely Masanauts πŸ§‘β€πŸš€πŸ™ŒπŸš€πŸŒ•πŸŒŒπŸͺ\ndon't forget to stake your $MASA tokens on \nhttps://t.co/JqWD5vbmBJ. and\nget your $MASA staked tokens worked for a long run vision and bonus. \nAlmost 9,508,941 token staked at the time.\nFollow @getmasafi for future innovational updates. https://t.co/uPWs2Ci6Hl","Thread":null,"TimeParsed":"2024-06-23T07:47:55Z","Timestamp":1719128875,"URLs":["https://app.masa.finance/staking"],"UserID":"1631362334412382208","Username":"Pingzkp","Videos":[{"ID":"1804781709818200064","Preview":"https://pbs.twimg.com/ext_tw_video_thumb/1804781709818200064/pu/img/CDl1kFuOtb0_B5xd.jpg","URL":"https://video.twimg.com/ext_tw_video/1804781709818200064/pu/vid/avc1/1280x720/E1uAbATdUoMZm93T.mp4?tag=12"}],"Views":242,"SensitiveContent":false},{"ConversationID":"1804424090297536731","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Let's fvkin crush this day $MASA\u003cbr\u003eGMGeeeeeeeeeM πŸ‘","ID":"1804642402268774598","InReplyToStatus":null,"InReplyToStatusID":"1804593726008029558","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Albe","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/albeblock/status/1804642402268774598","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Let's fvkin crush this day $MASA\nGMGeeeeeeeeeM πŸ‘","Thread":null,"TimeParsed":"2024-06-22T22:27:31Z","Timestamp":1719095251,"URLs":null,"UserID":"1630116075831455745","Username":"albeblock","Videos":null,"Views":18,"SensitiveContent":false},{"ConversationID":"1804584396701233202","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/fj3Q5MN4yx\u003c/a\u003e \u003cbr\u003e\u003cbr\u003eIf you have $MASA tockens and while the market is quiet, STAKE them and earn πŸ₯©πŸ»","ID":"1804584396701233202","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"Martin Gibbons","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/Martinbaldieg/status/1804584396701233202","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/fj3Q5MN4yx \n\nIf you have $MASA tockens and while the market is quiet, STAKE them and earn πŸ₯©πŸ»","Thread":null,"TimeParsed":"2024-06-22T18:37:02Z","Timestamp":1719081422,"URLs":["http://app.masa.ai/staking"],"UserID":"964660908","Username":"Martinbaldieg","Videos":null,"Views":119,"SensitiveContent":false},{"ConversationID":"1804156860255343088","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1804156860255343088","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1804156860255343088","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-21T14:18:09Z","Timestamp":1718979489,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":98,"SensitiveContent":false},{"ConversationID":"1804156677278831021","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1804156677278831021","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1804156677278831021","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-21T14:17:26Z","Timestamp":1718979446,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":78,"SensitiveContent":false},{"ConversationID":"1804156582227509551","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1804156582227509551","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1804156582227509551","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-21T14:17:03Z","Timestamp":1718979423,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":96,"SensitiveContent":false},{"ConversationID":"1803738815829541228","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Good Morning $masa πŸ™Œ","ID":"1803869116924670132","InReplyToStatus":null,"InReplyToStatusID":"1803867369997242667","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"β€’β—‰ π•„π•€π•π• π•‚π•Ÿπ• π•¨π•€.𝕖π•₯𝕙 β—‰β€’","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/AlchemiDream/status/1803869116924670132","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Good Morning $masa πŸ™Œ","Thread":null,"TimeParsed":"2024-06-20T19:14:46Z","Timestamp":1718910886,"URLs":null,"UserID":"1470873270761238528","Username":"AlchemiDream","Videos":null,"Views":21,"SensitiveContent":false},{"ConversationID":"1803699314650214764","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e G to the M $MASA πŸŽ‰\u003cbr\u003eWish you an awesome Thursday","ID":"1803743159458881953","InReplyToStatus":null,"InReplyToStatusID":"1803734609907073301","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Albe","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/albeblock/status/1803743159458881953","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa G to the M $MASA πŸŽ‰\nWish you an awesome Thursday","Thread":null,"TimeParsed":"2024-06-20T10:54:15Z","Timestamp":1718880855,"URLs":null,"UserID":"1630116075831455745","Username":"albeblock","Videos":null,"Views":25,"SensitiveContent":false},{"ConversationID":"1803711232152936791","GIFs":null,"Hashtags":["LISTA","Lista"],"HTML":"Claim your $LISTA tokens πŸ‘‡πŸ‘‡\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR \u003cbr\u003e$LISTA $Lista \u003ca href=\"https://twitter.com/hashtag/LISTA\"\u003e#LISTA\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Lista\"\u003e#Lista\u003c/a\u003e $ETH $ARB $MATIC $AVAX $BNB $BLAST $EIGEN $ZRO","ID":"1803711232152936791","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1803711232152936791","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"1803696954117071307","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Claim your $LISTA tokens πŸ‘‡πŸ‘‡\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR \n$LISTA $Lista #LISTA #Lista $ETH $ARB $MATIC $AVAX $BNB $BLAST $EIGEN $ZRO","Thread":null,"TimeParsed":"2024-06-20T08:47:23Z","Timestamp":1718873243,"URLs":null,"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":331,"SensitiveContent":false},{"ConversationID":"1803702146107658285","GIFs":null,"Hashtags":["LISTA","Lista"],"HTML":"Get your $LISTA tokens πŸ‘‡πŸ‘‡\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR $LISTA $Lista \u003ca href=\"https://twitter.com/hashtag/LISTA\"\u003e#LISTA\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Lista\"\u003e#Lista\u003c/a\u003e $ETH $ARB $MATIC $AVAX $BNB $BLAST $EIGEN $ZRO","ID":"1803702146107658285","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":4,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1803702146107658285","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"1803698928891621881","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Get your $LISTA tokens πŸ‘‡πŸ‘‡\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR $LISTA $Lista #LISTA #Lista $ETH $ARB $MATIC $AVAX $BNB $BLAST $EIGEN $ZRO","Thread":null,"TimeParsed":"2024-06-20T08:11:17Z","Timestamp":1718871077,"URLs":null,"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":410,"SensitiveContent":false},{"ConversationID":"1803701695303786814","GIFs":null,"Hashtags":["Blasterswap","Blast","BlastFi","blastecosystem","Blastfest","Blastoff","BlastDomain"],"HTML":"Get your $LISTA tokens πŸ‘‡πŸ‘‡\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR \u003ca href=\"https://twitter.com/hashtag/Blasterswap\"\u003e#Blasterswap\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blast\"\u003e#Blast\u003c/a\u003e $BlastGold \u003ca href=\"https://twitter.com/hashtag/BlastFi\"\u003e#BlastFi\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/blastecosystem\"\u003e#blastecosystem\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blastfest\"\u003e#Blastfest\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blastoff\"\u003e#Blastoff\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/BlastDomain\"\u003e#BlastDomain\u003c/a\u003e","ID":"1803701695303786814","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":4,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1803701695303786814","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"1803696954117071307","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Get your $LISTA tokens πŸ‘‡πŸ‘‡\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR #Blasterswap #Blast $BlastGold #BlastFi #blastecosystem #Blastfest #Blastoff #BlastDomain","Thread":null,"TimeParsed":"2024-06-20T08:09:29Z","Timestamp":1718870969,"URLs":null,"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":411,"SensitiveContent":false},{"ConversationID":"1803490524453621833","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/X2iJUD3St9\u003c/a\u003e","ID":"1803490524453621833","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"MGH.eth","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/MahtumkuliH/status/1803490524453621833","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/X2iJUD3St9","Thread":null,"TimeParsed":"2024-06-19T18:10:22Z","Timestamp":1718820622,"URLs":["http://app.masa.ai/staking"],"UserID":"1439250815533867014","Username":"MahtumkuliH","Videos":null,"Views":121,"SensitiveContent":false},{"ConversationID":"1803403023794028796","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1803403023794028796","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1803403023794028796","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-19T12:22:41Z","Timestamp":1718799761,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":106,"SensitiveContent":false},{"ConversationID":"1803402904931541199","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1803402904931541199","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1803402904931541199","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-19T12:22:12Z","Timestamp":1718799732,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":129,"SensitiveContent":false},{"ConversationID":"1803402787059015826","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1803402787059015826","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1803402787059015826","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-19T12:21:44Z","Timestamp":1718799704,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":86,"SensitiveContent":false},{"ConversationID":"1803323766325338260","GIFs":null,"Hashtags":null,"HTML":"$MASA (ETH)\u003cbr\u003e\u003cbr\u003eAs the election is getting closer Trump tokens gain more and more hype. At the moment l am looking at this one which has a great team behind it and l believe it can do very well.\u003cbr\u003e\u003cbr\u003eTelegram:\u003ca href=\"https://t.me/trumplander_portal\"\u003ehttps://t.co/QAVUykQ9aS\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eDYOR! \u003cbr\u003e\u003ca href=\"https://t.co/ApdteBSynQ\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GQaxaLAWgAAGlnA.jpg\"/\u003e\u003c/a\u003e","ID":"1803323766325338260","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"Kong","Mentions":null,"PermanentURL":"https://twitter.com/Kong_Calls/status/1803323766325338260","Photos":[{"ID":"1803323763997442048","URL":"https://pbs.twimg.com/media/GQaxaLAWgAAGlnA.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":4,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"$MASA (ETH)\n\nAs the election is getting closer Trump tokens gain more and more hype. At the moment l am looking at this one which has a great team behind it and l believe it can do very well.\n\nTelegram:https://t.co/QAVUykQ9aS\n\nDYOR! https://t.co/ApdteBSynQ","Thread":null,"TimeParsed":"2024-06-19T07:07:44Z","Timestamp":1718780864,"URLs":["https://t.me/trumplander_portal"],"UserID":"1607087740767674368","Username":"Kong_Calls","Videos":null,"Views":351,"SensitiveContent":false},{"ConversationID":"1803136602509889803","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/ZPY9Jk2Bbf\u003c/a\u003e","ID":"1803136602509889803","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"2short.eth","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/ZivileLT/status/1803136602509889803","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/ZPY9Jk2Bbf","Thread":null,"TimeParsed":"2024-06-18T18:44:01Z","Timestamp":1718736241,"URLs":["http://app.masa.ai/staking"],"UserID":"1372618441136467973","Username":"ZivileLT","Videos":null,"Views":28,"SensitiveContent":false},{"ConversationID":"1802974538407506206","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e GMGM $MASA 🀍 \u003cbr\u003eHave a absolute banger of a Tuesday","ID":"1803081940762841245","InReplyToStatus":null,"InReplyToStatusID":"1803002742233051381","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Albe","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/albeblock/status/1803081940762841245","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa GMGM $MASA 🀍 \nHave a absolute banger of a Tuesday","Thread":null,"TimeParsed":"2024-06-18T15:06:48Z","Timestamp":1718723208,"URLs":null,"UserID":"1630116075831455745","Username":"albeblock","Videos":null,"Views":13,"SensitiveContent":false},{"ConversationID":"1803051396046176260","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Have a good one $MASA πŸŒ…","ID":"1803081509185941768","InReplyToStatus":null,"InReplyToStatusID":"1803078855139471408","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Sins","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/Sinsonx/status/1803081509185941768","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Have a good one $MASA πŸŒ…","Thread":null,"TimeParsed":"2024-06-18T15:05:06Z","Timestamp":1718723106,"URLs":null,"UserID":"1518848178228916225","Username":"Sinsonx","Videos":null,"Views":17,"SensitiveContent":false},{"ConversationID":"1802697023893942495","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1802697023893942495","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1802697023893942495","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-17T13:37:17Z","Timestamp":1718631437,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":110,"SensitiveContent":false},{"ConversationID":"1802696940188205231","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1802696940188205231","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1802696940188205231","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-17T13:36:57Z","Timestamp":1718631417,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":105,"SensitiveContent":false},{"ConversationID":"1802696789465907325","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1802696789465907325","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1802696789465907325","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-17T13:36:21Z","Timestamp":1718631381,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":104,"SensitiveContent":false},{"ConversationID":"1802249758955942289","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e Goood Morning $MASA πŸ‘‹\u003cbr\u003eHave a wonderful Sunday","ID":"1802386780106158334","InReplyToStatus":null,"InReplyToStatusID":"1802283946585280854","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Albe","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/albeblock/status/1802386780106158334","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa Goood Morning $MASA πŸ‘‹\nHave a wonderful Sunday","Thread":null,"TimeParsed":"2024-06-16T17:04:29Z","Timestamp":1718557469,"URLs":null,"UserID":"1630116075831455745","Username":"albeblock","Videos":null,"Views":39,"SensitiveContent":false},{"ConversationID":"1802027833969303894","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1802027833969303894","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1802027833969303894","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-15T17:18:10Z","Timestamp":1718471890,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":157,"SensitiveContent":false},{"ConversationID":"1802027759088394543","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1802027759088394543","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1802027759088394543","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-15T17:17:52Z","Timestamp":1718471872,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":132,"SensitiveContent":false},{"ConversationID":"1802027660803252487","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1802027660803252487","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1802027660803252487","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-15T17:17:29Z","Timestamp":1718471849,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":149,"SensitiveContent":false},{"ConversationID":"1801833137149788161","GIFs":null,"Hashtags":["Blasterswap","Blast","BlastFi","blastecosystem","Blastfest","Blastoff","BlastDomain"],"HTML":"Claim your $BLAST tokens guys πŸ‘‡πŸ‘‡\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR \u003ca href=\"https://twitter.com/hashtag/Blasterswap\"\u003e#Blasterswap\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blast\"\u003e#Blast\u003c/a\u003e $BlastGold \u003ca href=\"https://twitter.com/hashtag/BlastFi\"\u003e#BlastFi\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/blastecosystem\"\u003e#blastecosystem\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blastfest\"\u003e#Blastfest\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blastoff\"\u003e#Blastoff\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/BlastDomain\"\u003e#BlastDomain\u003c/a\u003e","ID":"1801833137149788161","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":3,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1801833137149788161","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"1801832504824897649","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Claim your $BLAST tokens guys πŸ‘‡πŸ‘‡\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR #Blasterswap #Blast $BlastGold #BlastFi #blastecosystem #Blastfest #Blastoff #BlastDomain","Thread":null,"TimeParsed":"2024-06-15T04:24:30Z","Timestamp":1718425470,"URLs":null,"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":273,"SensitiveContent":false},{"ConversationID":"1801621763413184622","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e \u003ca href=\"https://twitter.com/tboe3D\"\u003e@tboe3D\u003c/a\u003e gm $MASA","ID":"1801756544507462103","InReplyToStatus":null,"InReplyToStatusID":"1801679138685915300","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Kim🌸CryptoπŸ§žβ€β™€οΈJourney🌸","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"},{"ID":"1059676619873243138","Username":"tboe3D","Name":"tboe 🍌"}],"PermanentURL":"https://twitter.com/ukim/status/1801756544507462103","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa @tboe3D gm $MASA","Thread":null,"TimeParsed":"2024-06-14T23:20:09Z","Timestamp":1718407209,"URLs":null,"UserID":"20519094","Username":"ukim","Videos":null,"Views":0,"SensitiveContent":false},{"ConversationID":"1801714786830532848","GIFs":null,"Hashtags":["Blasterswap","Blast","BlastFi"],"HTML":"πŸ’Έ Get Free $BLAST Tokens! πŸ’Έ\u003cbr\u003e\u003cbr\u003eParticipate in the airdrop now and secure your share !\u003cbr\u003e\u003cbr\u003eVisit πŸ‘‰ \u003ca href=\"http://claim.blastarswap.app\"\u003ehttps://t.co/xapG0LuouY\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eHurry, limited time offer!\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR \u003ca href=\"https://twitter.com/hashtag/Blasterswap\"\u003e#Blasterswap\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blast\"\u003e#Blast\u003c/a\u003e $BlastGold \u003ca href=\"https://twitter.com/hashtag/BlastFi\"\u003e#BlastFi\u003c/a\u003e \u003cbr\u003e\u003ca href=\"https://t.co/LmMhW3wOW0\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GQD6DJ8XsAEQr5c.jpg\"/\u003e\u003c/a\u003e","ID":"1801714786830532848","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":5,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1801714786830532848","Photos":[{"ID":"1801714783063879681","URL":"https://pbs.twimg.com/media/GQD6DJ8XsAEQr5c.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":4,"Retweets":4,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Έ Get Free $BLAST Tokens! πŸ’Έ\n\nParticipate in the airdrop now and secure your share !\n\nVisit πŸ‘‰ https://t.co/xapG0LuouY\n\nHurry, limited time offer!\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $BLSTR $PEPE $WIF $BLAST $BLSTR #Blasterswap #Blast $BlastGold #BlastFi https://t.co/LmMhW3wOW0","Thread":null,"TimeParsed":"2024-06-14T20:34:14Z","Timestamp":1718397254,"URLs":["http://claim.blastarswap.app"],"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":323,"SensitiveContent":false},{"ConversationID":"1801714403731247499","GIFs":null,"Hashtags":["Blasterswap","Blast","BlastFi","blastecosystem","Blastfest"],"HTML":"πŸ’Έ Get Free $BLAST Tokens! πŸ’Έ\u003cbr\u003e\u003cbr\u003eParticipate in the airdrop now and secure your share !\u003cbr\u003e\u003cbr\u003eVisit πŸ‘‰ \u003ca href=\"http://claim.blastarswap.app\"\u003ehttps://t.co/cVFAh2T3HE\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eHurry, limited time offer!\u003cbr\u003e\u003cbr\u003e$MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $PEPE $WIF $BLAST $BLSTR \u003ca href=\"https://twitter.com/hashtag/Blasterswap\"\u003e#Blasterswap\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blast\"\u003e#Blast\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/BlastFi\"\u003e#BlastFi\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/blastecosystem\"\u003e#blastecosystem\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Blastfest\"\u003e#Blastfest\u003c/a\u003e \u003cbr\u003e\u003ca href=\"https://t.co/xvfIbc12Kw\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GQD5s4BWQAAkHBZ.jpg\"/\u003e\u003c/a\u003e","ID":"1801714403731247499","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":3,"Name":"SwiftZen.eth","Mentions":null,"PermanentURL":"https://twitter.com/queensnative91/status/1801714403731247499","Photos":[{"ID":"1801714400295796736","URL":"https://pbs.twimg.com/media/GQD5s4BWQAAkHBZ.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":1,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Έ Get Free $BLAST Tokens! πŸ’Έ\n\nParticipate in the airdrop now and secure your share !\n\nVisit πŸ‘‰ https://t.co/cVFAh2T3HE\n\nHurry, limited time offer!\n\n$MASA $HASHAI $MOCHI $BODEN $DUKO $W $WOOF $VENOM $PEPE $WIF $BLAST $BLSTR #Blasterswap #Blast #BlastFi #blastecosystem #Blastfest https://t.co/xvfIbc12Kw","Thread":null,"TimeParsed":"2024-06-14T20:32:42Z","Timestamp":1718397162,"URLs":["http://claim.blastarswap.app"],"UserID":"1165504451538558976","Username":"queensnative91","Videos":null,"Views":288,"SensitiveContent":false},{"ConversationID":"1801683074117161368","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/Qk4IGcOlNG\u003c/a\u003e","ID":"1801683074117161368","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Simerenya","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/OlanZapin1/status/1801683074117161368","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/Qk4IGcOlNG","Thread":null,"TimeParsed":"2024-06-14T18:28:13Z","Timestamp":1718389693,"URLs":["http://app.masa.ai/staking"],"UserID":"1374510852","Username":"OlanZapin1","Videos":null,"Views":93,"SensitiveContent":false},{"ConversationID":"1801499973755801609","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/TFRXgKKIZ7\u003c/a\u003e","ID":"1801499973755801609","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"thais adelino β™₯️ Memecoin ❀️ $WELL","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/thaisadelino/status/1801499973755801609","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/TFRXgKKIZ7","Thread":null,"TimeParsed":"2024-06-14T06:20:38Z","Timestamp":1718346038,"URLs":["http://app.masa.ai/staking"],"UserID":"56484074","Username":"thaisadelino","Videos":null,"Views":41,"SensitiveContent":false},{"ConversationID":"1801286739161690354","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1801286739161690354","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1801286739161690354","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-13T16:13:19Z","Timestamp":1718295199,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":75,"SensitiveContent":false},{"ConversationID":"1801280845279531302","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1801280845279531302","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1801280845279531302","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-13T15:49:54Z","Timestamp":1718293794,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":76,"SensitiveContent":false},{"ConversationID":"1801267851652960455","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1801267851652960455","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1801267851652960455","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-13T14:58:16Z","Timestamp":1718290696,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":88,"SensitiveContent":false},{"ConversationID":"1801262070257594682","GIFs":null,"Hashtags":null,"HTML":"By participating in $MASA staking, you not only stack extra tokens, but also play a vital role in enhancing the Masa Network’s security, stability, and decentralization.\u003cbr\u003e\u003cbr\u003e\u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e has enabled this staking to better rewards its participants with great rewards \u003cbr\u003e\u003ca href=\"https://t.co/z3Lqc23Ni9\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GP9eTLeXUAASLf9.jpg\"/\u003e\u003c/a\u003e","ID":"1801262070257594682","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Dr. Sir Chuks","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/sirchuks_01/status/1801262070257594682","Photos":[{"ID":"1801262059562160128","URL":"https://pbs.twimg.com/media/GP9eTLeXUAASLf9.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":1,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"By participating in $MASA staking, you not only stack extra tokens, but also play a vital role in enhancing the Masa Network’s security, stability, and decentralization.\n\n@getmasafi has enabled this staking to better rewards its participants with great rewards https://t.co/z3Lqc23Ni9","Thread":null,"TimeParsed":"2024-06-13T14:35:18Z","Timestamp":1718289318,"URLs":null,"UserID":"970266145352712192","Username":"sirchuks_01","Videos":null,"Views":347,"SensitiveContent":false},{"ConversationID":"1801175685555171582","GIFs":null,"Hashtags":null,"HTML":"KIP Protocol [KIP] has announced a partnership with Masa [MASA]\u003cbr\u003e\u003cbr\u003e\u003ca href=\"https://twitter.com/KIPprotocol\"\u003e@KIPprotocol\u003c/a\u003e $KIP teams up with \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e, a data platform, allowing users to contribute personal data and receive compensation in the form of a $MASA native token. Through this partnership, projects will work \u003cbr\u003e\u003ca href=\"https://t.co/OFLr10Wjjd\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GP8PtWvWkAEQl33.jpg\"/\u003e\u003c/a\u003e","ID":"1801175685555171582","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":7,"Name":"TOP 7 ICO | #StandWithUkraineπŸ‡ΊπŸ‡¦","Mentions":[{"ID":"1717834005981401088","Username":"KIPprotocol","Name":"KIP Protocol"},{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/top7ico/status/1801175685555171582","Photos":[{"ID":"1801175647844208641","URL":"https://pbs.twimg.com/media/GP8PtWvWkAEQl33.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":2,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"KIP Protocol [KIP] has announced a partnership with Masa [MASA]\n\n@KIPprotocol $KIP teams up with @getmasafi, a data platform, allowing users to contribute personal data and receive compensation in the form of a $MASA native token. Through this partnership, projects will work https://t.co/OFLr10Wjjd","Thread":null,"TimeParsed":"2024-06-13T08:52:02Z","Timestamp":1718268722,"URLs":null,"UserID":"945716524836409345","Username":"top7ico","Videos":null,"Views":1949,"SensitiveContent":false},{"ConversationID":"1800882634987618637","GIFs":null,"Hashtags":null,"HTML":"8th attempt was successfully today!!! I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/5CcIhneWQg\u003c/a\u003e","ID":"1800882634987618637","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Project_UG","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/Maik81413384/status/1800882634987618637","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"8th attempt was successfully today!!! I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/5CcIhneWQg","Thread":null,"TimeParsed":"2024-06-12T13:27:33Z","Timestamp":1718198853,"URLs":["http://app.masa.ai/staking"],"UserID":"1180485440081666048","Username":"Maik81413384","Videos":null,"Views":26,"SensitiveContent":false},{"ConversationID":"1800832547280277639","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/t3GdUayGlN\u003c/a\u003e","ID":"1800832547280277639","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Eddie (Unbelievable) .fuel | Areon ♦️","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/UnbelievableEd/status/1800832547280277639","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/t3GdUayGlN","Thread":null,"TimeParsed":"2024-06-12T10:08:31Z","Timestamp":1718186911,"URLs":["http://app.masa.ai/staking"],"UserID":"1599137695493758977","Username":"UnbelievableEd","Videos":null,"Views":20,"SensitiveContent":false},{"ConversationID":"1800574007445684350","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1800574007445684350","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1800574007445684350","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-11T17:01:11Z","Timestamp":1718125271,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":162,"SensitiveContent":false},{"ConversationID":"1800573949216186449","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1800573949216186449","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1800573949216186449","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-11T17:00:57Z","Timestamp":1718125257,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":133,"SensitiveContent":false},{"ConversationID":"1800573853128966379","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1800573853128966379","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1800573853128966379","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-11T17:00:34Z","Timestamp":1718125234,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":119,"SensitiveContent":false},{"ConversationID":"1800468022295195693","GIFs":null,"Hashtags":["RLR"],"HTML":"Top-11 Privacy PJTs by Relative Liquidity Ratio (RLR)\u003cbr\u003e\u003cbr\u003e\u003ca href=\"https://twitter.com/hashtag/RLR\"\u003e#RLR\u003c/a\u003e is a 24H Trading Volume to Market Cap ratio. The higher the ratio, the higher traders' interest in the Token and token liquidity. \u003cbr\u003e\u003cbr\u003e$MASA $WLD $ZEC $ROSE $LAI $DUSK $PIVX $ICP $PHA $XMR $SNT \u003cbr\u003e\u003ca href=\"https://t.co/T5lkcYIXNJ\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GPyL3S8XwAA0I65.jpg\"/\u003e\u003c/a\u003e","ID":"1800468022295195693","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":22,"Name":"Cryptolaxy #StandWithUkraine","Mentions":null,"PermanentURL":"https://twitter.com/Cryptolaxy/status/1800468022295195693","Photos":[{"ID":"1800467733135474688","URL":"https://pbs.twimg.com/media/GPyL3S8XwAA0I65.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":5,"Retweets":6,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Top-11 Privacy PJTs by Relative Liquidity Ratio (RLR)\n\n#RLR is a 24H Trading Volume to Market Cap ratio. The higher the ratio, the higher traders' interest in the Token and token liquidity. \n\n$MASA $WLD $ZEC $ROSE $LAI $DUSK $PIVX $ICP $PHA $XMR $SNT https://t.co/T5lkcYIXNJ","Thread":null,"TimeParsed":"2024-06-11T10:00:02Z","Timestamp":1718100002,"URLs":null,"UserID":"1383688591512006657","Username":"Cryptolaxy","Videos":null,"Views":1730,"SensitiveContent":false},{"ConversationID":"1800003482768040152","GIFs":null,"Hashtags":null,"HTML":"πŸ€” Top 8 Projects Will Unlock Tokens this Week | June 10 - 16 😊\u003cbr\u003e\u003cbr\u003e➑️ Monitor the actions of Smart Money to gain additional insights: \u003ca href=\"https://icrypto.ai/\"\u003ehttps://t.co/7yX6uETlOy\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e1. $ICP - $26.51M ~ 0.52% M.cap - June 11\u003cbr\u003e\u003cbr\u003e2. $MASA - $2.51M ~ 22.39% M.cap - June 11\u003cbr\u003e\u003cbr\u003e3. $APT - $96.16M ~ 2.58% M.cap - \u003cbr\u003e\u003ca href=\"https://t.co/7YKYvbWMZH\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GPrlfR-bAAAnUvr.jpg\"/\u003e\u003c/a\u003e","ID":"1800003482768040152","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":3,"Name":"iCrypto | Sentiment \u0026 On-chain Analysis","Mentions":null,"PermanentURL":"https://twitter.com/iCryptoAI/status/1800003482768040152","Photos":[{"ID":"1800003326651858944","URL":"https://pbs.twimg.com/media/GPrlfR-bAAAnUvr.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ€” Top 8 Projects Will Unlock Tokens this Week | June 10 - 16 😊\n\n➑️ Monitor the actions of Smart Money to gain additional insights: https://t.co/7yX6uETlOy\n\n1. $ICP - $26.51M ~ 0.52% M.cap - June 11\n\n2. $MASA - $2.51M ~ 22.39% M.cap - June 11\n\n3. $APT - $96.16M ~ 2.58% M.cap - https://t.co/7YKYvbWMZH","Thread":null,"TimeParsed":"2024-06-10T03:14:07Z","Timestamp":1717989247,"URLs":["https://icrypto.ai/"],"UserID":"1566351693733777408","Username":"iCryptoAI","Videos":null,"Views":1696,"SensitiveContent":false},{"ConversationID":"1799947146374058450","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/crypto_bitlord7\"\u003e@crypto_bitlord7\u003c/a\u003e I really am... I aped Tyson and Paul meta tokens on solana and also maga straight $masa tokens for after pride month lol.","ID":"1799949198097301977","InReplyToStatus":null,"InReplyToStatusID":"1799947146374058450","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"πŸ΄β€β˜ οΈπŸ‘½ Big T πŸ‘½πŸ΄β€β˜ οΈ","Mentions":[{"ID":"1343224146658914304","Username":"crypto_bitlord7","Name":"Crypto Bitlord"}],"PermanentURL":"https://twitter.com/bigticeman1/status/1799949198097301977","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@crypto_bitlord7 I really am... I aped Tyson and Paul meta tokens on solana and also maga straight $masa tokens for after pride month lol.","Thread":null,"TimeParsed":"2024-06-09T23:38:24Z","Timestamp":1717976304,"URLs":null,"UserID":"1488883906229284865","Username":"bigticeman1","Videos":null,"Views":74,"SensitiveContent":false},{"ConversationID":"1799787076860498098","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1799787076860498098","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1799787076860498098","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-09T12:54:12Z","Timestamp":1717937652,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":134,"SensitiveContent":false},{"ConversationID":"1799786990998847729","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1799786990998847729","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1799786990998847729","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-09T12:53:51Z","Timestamp":1717937631,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":131,"SensitiveContent":false},{"ConversationID":"1799786907859374221","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1799786907859374221","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1799786907859374221","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-09T12:53:31Z","Timestamp":1717937611,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":139,"SensitiveContent":false},{"ConversationID":"1799634837177073943","GIFs":null,"Hashtags":null,"HTML":"✨ \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e Δ‘ang liΓͺn tα»₯c partnership vα»›i nhα»―ng AI project tiềm nΔƒng nhΖ° Sleepless AI, Holoworld AI,...\u003cbr\u003e\u003cbr\u003eDα»± Γ‘n cΕ©ng Δ‘ang mở rα»™ng phΓ‘t triển trΓͺn hệ Base, Avalanche vΓ  gia tΔƒng chỉ sα»‘ token được stake (↗️9M $MASA).\u003cbr\u003e\u003cbr\u003eπŸ“ˆ GiΓ‘ $MASA Δ‘ang Δ‘iều chỉnh sau khi pump gαΊ§n \u003cbr\u003e\u003ca href=\"https://t.co/C9wGvbf3qT\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GPmWLwabYAAJrUr.jpg\"/\u003e\u003c/a\u003e","ID":"1799634837177073943","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":37,"Name":"TradeCoinVN","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/TCVNcommunity/status/1799634837177073943","Photos":[{"ID":"1799634654829699072","URL":"https://pbs.twimg.com/media/GPmWLwabYAAJrUr.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"1798263706691727755","Replies":31,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"✨ @getmasafi Δ‘ang liΓͺn tα»₯c partnership vα»›i nhα»―ng AI project tiềm nΔƒng nhΖ° Sleepless AI, Holoworld AI,...\n\nDα»± Γ‘n cΕ©ng Δ‘ang mở rα»™ng phΓ‘t triển trΓͺn hệ Base, Avalanche vΓ  gia tΔƒng chỉ sα»‘ token được stake (↗️9M $MASA).\n\nπŸ“ˆ GiΓ‘ $MASA Δ‘ang Δ‘iều chỉnh sau khi pump gαΊ§n https://t.co/C9wGvbf3qT","Thread":null,"TimeParsed":"2024-06-09T02:49:15Z","Timestamp":1717901355,"URLs":null,"UserID":"1408257733837484034","Username":"TCVNcommunity","Videos":null,"Views":10768,"SensitiveContent":false},{"ConversationID":"1799400785266327780","GIFs":null,"Hashtags":null,"HTML":"Still hesitating whether you should invest in $MASA Token?\u003cbr\u003eThen this is for youπŸ‘‡ \u003cbr\u003e\u003ca href=\"https://t.co/uk7Cc1yf4h\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GPjBb2YWMAE3MnZ.jpg\"/\u003e\u003c/a\u003e","ID":"1799400785266327780","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Yura","Mentions":null,"PermanentURL":"https://twitter.com/Yura61718492/status/1799400785266327780","Photos":[{"ID":"1799400735332773889","URL":"https://pbs.twimg.com/media/GPjBb2YWMAE3MnZ.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Still hesitating whether you should invest in $MASA Token?\nThen this is for youπŸ‘‡ https://t.co/uk7Cc1yf4h","Thread":null,"TimeParsed":"2024-06-08T11:19:13Z","Timestamp":1717845553,"URLs":null,"UserID":"1333063442303954945","Username":"Yura61718492","Videos":null,"Views":65,"SensitiveContent":false},{"ConversationID":"1799053573147492646","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/tokenmasa\"\u003e@tokenmasa\u003c/a\u003e GM $MASA πŸ‘Š","ID":"1799147627206115351","InReplyToStatus":null,"InReplyToStatusID":"1799145106966192145","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Miroβš’οΈ","Mentions":[{"ID":"1707391788062044161","Username":"tokenmasa","Name":"$MASA"}],"PermanentURL":"https://twitter.com/miroweb3/status/1799147627206115351","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@tokenmasa GM $MASA πŸ‘Š","Thread":null,"TimeParsed":"2024-06-07T18:33:15Z","Timestamp":1717785195,"URLs":null,"UserID":"1116160319494283266","Username":"miroweb3","Videos":null,"Views":24,"SensitiveContent":false},{"ConversationID":"1799100666968993967","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1799100666968993967","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1799100666968993967","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-07T15:26:39Z","Timestamp":1717773999,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":93,"SensitiveContent":false},{"ConversationID":"1799100528993214942","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1799100528993214942","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1799100528993214942","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-07T15:26:06Z","Timestamp":1717773966,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":79,"SensitiveContent":false},{"ConversationID":"1799100412810895425","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1799100412810895425","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1799100412810895425","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-07T15:25:38Z","Timestamp":1717773938,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":95,"SensitiveContent":false},{"ConversationID":"1799025405527195850","GIFs":null,"Hashtags":null,"HTML":"Less than two months have passed since \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e launched mainnet As you know MASA is \u003ca href=\"https://twitter.com/avax\"\u003e@avax\u003c/a\u003e subnet and now they are on TOP 10 by Total Transactions Count πŸš€\u003cbr\u003e\u003cbr\u003eIf you are looking for token with good potential pay attention to $MASA the price has increased by 12% over the last week \u003cbr\u003e\u003ca href=\"https://t.co/sb6opBlh8F\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GPdsEUcbcAAga-z.jpg\"/\u003e\u003c/a\u003e","ID":"1799025405527195850","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":18,"Name":"LirGo","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"},{"ID":"1055894724245155841","Username":"avax","Name":"Avalanche πŸ”Ί"}],"PermanentURL":"https://twitter.com/lir_go/status/1799025405527195850","Photos":[{"ID":"1799025397621026816","URL":"https://pbs.twimg.com/media/GPdsEUcbcAAga-z.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":12,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Less than two months have passed since @getmasafi launched mainnet As you know MASA is @avax subnet and now they are on TOP 10 by Total Transactions Count πŸš€\n\nIf you are looking for token with good potential pay attention to $MASA the price has increased by 12% over the last week https://t.co/sb6opBlh8F","Thread":null,"TimeParsed":"2024-06-07T10:27:35Z","Timestamp":1717756055,"URLs":null,"UserID":"1217520204823126025","Username":"lir_go","Videos":null,"Views":540,"SensitiveContent":false},{"ConversationID":"1798865710523064405","GIFs":null,"Hashtags":["Base"],"HTML":"Wanna know how to stake your $MASA token on \u003ca href=\"https://twitter.com/hashtag/Base\"\u003e#Base\u003c/a\u003e, Sit back and enjoy the rideπŸ‘ \u003cbr\u003e\u003ca href=\"https://t.co/hdogitiznR\"\u003e\u003cimg src=\"https://pbs.twimg.com/ext_tw_video_thumb/1798864119724199936/pu/img/HH-oX3IZmU6zp-NP.jpg\"/\u003e\u003c/a\u003e","ID":"1798865710523064405","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"MichealkizzuπŸ₯· πŸ‰$MON","Mentions":null,"PermanentURL":"https://twitter.com/michealkizzu/status/1798865710523064405","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Wanna know how to stake your $MASA token on #Base, Sit back and enjoy the rideπŸ‘ https://t.co/hdogitiznR","Thread":null,"TimeParsed":"2024-06-06T23:53:01Z","Timestamp":1717717981,"URLs":null,"UserID":"943893643039006720","Username":"michealkizzu","Videos":[{"ID":"1798864119724199936","Preview":"https://pbs.twimg.com/ext_tw_video_thumb/1798864119724199936/pu/img/HH-oX3IZmU6zp-NP.jpg","URL":"https://video.twimg.com/ext_tw_video/1798864119724199936/pu/vid/avc1/1280x720/MiX1JMvBCdQ2V0hn.mp4?tag=12"}],"Views":127,"SensitiveContent":false},{"ConversationID":"1798646032571760956","GIFs":null,"Hashtags":["Crypto","ClaimTokens","Solana","GROK"],"HTML":"Get your $ULTI tokens now guys πŸ‘‡πŸ‘‡\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN \u003ca href=\"https://twitter.com/hashtag/Crypto\"\u003e#Crypto\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/ClaimTokens\"\u003e#ClaimTokens\u003c/a\u003e $NAP $BLAST $GRASS $WELL $SOL $WIF $WEN $JUP \u003ca href=\"https://twitter.com/hashtag/Solana\"\u003e#Solana\u003c/a\u003e $PENG $TRUMP \u003ca href=\"https://twitter.com/hashtag/GROK\"\u003e#GROK\u003c/a\u003e $W $WOOF $VENOM $BLSTR $ENA $DYM $MANTA $ROOST $CHKN","ID":"1798646032571760956","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1798646032571760956","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"1798645389106803198","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Get your $ULTI tokens now guys πŸ‘‡πŸ‘‡\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN #Crypto #ClaimTokens $NAP $BLAST $GRASS $WELL $SOL $WIF $WEN $JUP #Solana $PENG $TRUMP #GROK $W $WOOF $VENOM $BLSTR $ENA $DYM $MANTA $ROOST $CHKN","Thread":null,"TimeParsed":"2024-06-06T09:20:06Z","Timestamp":1717665606,"URLs":null,"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":274,"SensitiveContent":false},{"ConversationID":"1798401389183504478","GIFs":null,"Hashtags":["Crypto","ClaimTokens","Solana","GROK"],"HTML":"Claim your $ULTI tokens guys πŸ‘‡πŸ‘‡\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN \u003ca href=\"https://twitter.com/hashtag/Crypto\"\u003e#Crypto\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/ClaimTokens\"\u003e#ClaimTokens\u003c/a\u003e $NAP $BLAST $GRASS $WELL $SOL $WIF $WEN $JUP \u003ca href=\"https://twitter.com/hashtag/Solana\"\u003e#Solana\u003c/a\u003e $PENG $TRUMP \u003ca href=\"https://twitter.com/hashtag/GROK\"\u003e#GROK\u003c/a\u003e $W $WOOF $VENOM $BLSTR $ENA $DYM $MANTA $ROOST $CHKN","ID":"1798401389183504478","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":1,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1798401389183504478","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"1798366957613539740","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Claim your $ULTI tokens guys πŸ‘‡πŸ‘‡\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN #Crypto #ClaimTokens $NAP $BLAST $GRASS $WELL $SOL $WIF $WEN $JUP #Solana $PENG $TRUMP #GROK $W $WOOF $VENOM $BLSTR $ENA $DYM $MANTA $ROOST $CHKN","Thread":null,"TimeParsed":"2024-06-05T17:07:58Z","Timestamp":1717607278,"URLs":null,"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":354,"SensitiveContent":false},{"ConversationID":"1798367146101366930","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1798367146101366930","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Arkvoodle","Mentions":null,"PermanentURL":"https://twitter.com/Arkvoodle_/status/1798367146101366930","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-05T14:51:54Z","Timestamp":1717599114,"URLs":null,"UserID":"1515047219455569984","Username":"Arkvoodle_","Videos":null,"Views":106,"SensitiveContent":false},{"ConversationID":"1798367031378727230","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1798367031378727230","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Coldblooded Ether Gang","Mentions":null,"PermanentURL":"https://twitter.com/Coldbloth_eth/status/1798367031378727230","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-05T14:51:26Z","Timestamp":1717599086,"URLs":null,"UserID":"1574779086597419010","Username":"Coldbloth_eth","Videos":null,"Views":107,"SensitiveContent":false},{"ConversationID":"1798366960264347874","GIFs":null,"Hashtags":null,"HTML":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \u003cbr\u003e \u003cbr\u003eπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \u003cbr\u003e \u003cbr\u003eDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","ID":"1798366960264347874","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"dulco69","Mentions":null,"PermanentURL":"https://twitter.com/dulco692/status/1798366960264347874","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Ž Tokenmasa $MASA Worth $100 FREE Airdrop Giveaway πŸ’Ž \n \nπŸ’₯ LET'S HYPE $MASA ON TWITTER πŸ’₯ \n \nDo various twitter and telegram task for Tokenmasa to grow the community and win a chance to receive in total of 1000 $MASA for every valid entry.","Thread":null,"TimeParsed":"2024-06-05T14:51:10Z","Timestamp":1717599070,"URLs":null,"UserID":"1574788374594224129","Username":"dulco692","Videos":null,"Views":87,"SensitiveContent":false},{"ConversationID":"1798363898900582865","GIFs":null,"Hashtags":["Crypto","ClaimTokens","Solana","GROK"],"HTML":"Claim your $ULTI tokens now πŸ‘‡πŸ‘‡\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN \u003ca href=\"https://twitter.com/hashtag/Crypto\"\u003e#Crypto\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/ClaimTokens\"\u003e#ClaimTokens\u003c/a\u003e $NAP $BLAST $GRASS $WELL $SOL $WIF $WEN $JUP \u003ca href=\"https://twitter.com/hashtag/Solana\"\u003e#Solana\u003c/a\u003e $PENG $TRUMP \u003ca href=\"https://twitter.com/hashtag/GROK\"\u003e#GROK\u003c/a\u003e $W $WOOF $VENOM $BLSTR $ENA $DYM $MANTA $ROOST $CHKN","ID":"1798363898900582865","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":true,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"SwiftZen.eth","Mentions":null,"PermanentURL":"https://twitter.com/queensnative91/status/1798363898900582865","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"1798360849305792676","Replies":1,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Claim your $ULTI tokens now πŸ‘‡πŸ‘‡\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN #Crypto #ClaimTokens $NAP $BLAST $GRASS $WELL $SOL $WIF $WEN $JUP #Solana $PENG $TRUMP #GROK $W $WOOF $VENOM $BLSTR $ENA $DYM $MANTA $ROOST $CHKN","Thread":null,"TimeParsed":"2024-06-05T14:39:00Z","Timestamp":1717598340,"URLs":null,"UserID":"1165504451538558976","Username":"queensnative91","Videos":null,"Views":439,"SensitiveContent":false},{"ConversationID":"1798055457409605853","GIFs":null,"Hashtags":["Crypto","ClaimTokens"],"HTML":"πŸ’Έ Get Free $ULTI Tokens! πŸ’Έ\u003cbr\u003e\u003cbr\u003eParticipate in the airdrop now and secure your share !\u003cbr\u003e\u003cbr\u003eVisit πŸ‘‰ \u003ca href=\"http://claim.ultivarse.io\"\u003ehttps://t.co/n0Su0e1E2X\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eHurry, limited time offer!\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN \u003ca href=\"https://twitter.com/hashtag/Crypto\"\u003e#Crypto\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/ClaimTokens\"\u003e#ClaimTokens\u003c/a\u003e $NAP $BLAST $GRASS $WELL \u003cbr\u003e\u003ca href=\"https://t.co/51QnVMnXV8\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GPP56KMaoAAx3Jr.jpg\"/\u003e\u003c/a\u003e","ID":"1798055457409605853","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":2,"Name":"Arnold Bennet","Mentions":null,"PermanentURL":"https://twitter.com/ArnoldBennet/status/1798055457409605853","Photos":[{"ID":"1798055453815119872","URL":"https://pbs.twimg.com/media/GPP56KMaoAAx3Jr.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":3,"Retweets":1,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Έ Get Free $ULTI Tokens! πŸ’Έ\n\nParticipate in the airdrop now and secure your share !\n\nVisit πŸ‘‰ https://t.co/n0Su0e1E2X\n\nHurry, limited time offer!\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN #Crypto #ClaimTokens $NAP $BLAST $GRASS $WELL https://t.co/51QnVMnXV8","Thread":null,"TimeParsed":"2024-06-04T18:13:21Z","Timestamp":1717524801,"URLs":["http://claim.ultivarse.io"],"UserID":"797685054017138688","Username":"ArnoldBennet","Videos":null,"Views":306,"SensitiveContent":false},{"ConversationID":"1798055179650216401","GIFs":null,"Hashtags":["Crypto","ClaimTokens"],"HTML":"πŸ’Έ Get Free $ULTI Tokens! πŸ’Έ\u003cbr\u003e\u003cbr\u003eParticipate in the airdrop now and secure your share !\u003cbr\u003e\u003cbr\u003eVisit πŸ‘‰ \u003ca href=\"http://claim.ultivarse.io\"\u003ehttps://t.co/HWEvzjvELQ\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eHurry, limited time offer!\u003cbr\u003e\u003cbr\u003e$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN \u003ca href=\"https://twitter.com/hashtag/Crypto\"\u003e#Crypto\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/ClaimTokens\"\u003e#ClaimTokens\u003c/a\u003e $NAP $BLAST $GRASS $WELL \u003cbr\u003e\u003ca href=\"https://t.co/ykHQ9Z2P5C\"\u003e\u003cimg src=\"https://pbs.twimg.com/media/GPP5pyJaYAAQqqd.jpg\"/\u003e\u003c/a\u003e","ID":"1798055179650216401","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":3,"Name":"SwiftZen.eth","Mentions":null,"PermanentURL":"https://twitter.com/queensnative91/status/1798055179650216401","Photos":[{"ID":"1798055172482162688","URL":"https://pbs.twimg.com/media/GPP5pyJaYAAQqqd.jpg"}],"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":4,"Retweets":2,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"πŸ’Έ Get Free $ULTI Tokens! πŸ’Έ\n\nParticipate in the airdrop now and secure your share !\n\nVisit πŸ‘‰ https://t.co/HWEvzjvELQ\n\nHurry, limited time offer!\n\n$ULTI $MASA $HASHAI $MOCHI $BODEN $DUKO $ENA $BONUS $VSX $CAT $BOSI $MOON $mfer $DEGEN #Crypto #ClaimTokens $NAP $BLAST $GRASS $WELL https://t.co/ykHQ9Z2P5C","Thread":null,"TimeParsed":"2024-06-04T18:12:15Z","Timestamp":1717524735,"URLs":["http://claim.ultivarse.io"],"UserID":"1165504451538558976","Username":"queensnative91","Videos":null,"Views":298,"SensitiveContent":false},{"ConversationID":"1798021540367544362","GIFs":null,"Hashtags":["MASA","AI","Airdrop"],"HTML":"$MASA is TOP Future AI blockchain. I’m bullish on MASA πŸ€‘\u003cbr\u003estake MASA tokens and earn, get income from your data that does not disclose who you are, get an airdrop. All this on the website \u003cbr\u003e\u003ca href=\"https://app.masa.finance/\"\u003ehttps://t.co/xkNw0VSQCe\u003c/a\u003e \u003cbr\u003e\u003ca href=\"https://twitter.com/hashtag/MASA\"\u003e#MASA\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/AI\"\u003e#AI\u003c/a\u003e \u003ca href=\"https://twitter.com/hashtag/Airdrop\"\u003e#Airdrop\u003c/a\u003e","ID":"1798021540367544362","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Pyatik .fuel πŸ›Έ","Mentions":null,"PermanentURL":"https://twitter.com/pyatikopow/status/1798021540367544362","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":1,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"$MASA is TOP Future AI blockchain. I’m bullish on MASA πŸ€‘\nstake MASA tokens and earn, get income from your data that does not disclose who you are, get an airdrop. All this on the website \nhttps://t.co/xkNw0VSQCe \n#MASA #AI #Airdrop","Thread":null,"TimeParsed":"2024-06-04T15:58:35Z","Timestamp":1717516715,"URLs":["https://app.masa.finance/"],"UserID":"1455988236002660354","Username":"pyatikopow","Videos":null,"Views":45,"SensitiveContent":false},{"ConversationID":"1788686534696206590","GIFs":null,"Hashtags":null,"HTML":"\u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"https://twitter.com/CoinList\"\u003e@CoinList\u003c/a\u003e This is a passive way to earn $MASA tokens and still show support to the community","ID":"1797767809893793957","InReplyToStatus":null,"InReplyToStatusID":"1788686534696206590","IsQuoted":false,"IsPin":false,"IsReply":true,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"MichealkizzuπŸ₯· πŸ‰$MON","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"},{"ID":"866047997456658434","Username":"CoinList","Name":"CoinList"}],"PermanentURL":"https://twitter.com/michealkizzu/status/1797767809893793957","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"@getmasafi @CoinList This is a passive way to earn $MASA tokens and still show support to the community","Thread":null,"TimeParsed":"2024-06-03T23:10:21Z","Timestamp":1717456221,"URLs":null,"UserID":"943893643039006720","Username":"michealkizzu","Videos":null,"Views":58,"SensitiveContent":false},{"ConversationID":"1797358744851952106","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/u8OnH6yurN\u003c/a\u003e","ID":"1797358744851952106","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"CoBsY.fuel","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/mistercbs/status/1797358744851952106","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/u8OnH6yurN","Thread":null,"TimeParsed":"2024-06-02T20:04:52Z","Timestamp":1717358692,"URLs":["http://app.masa.ai/staking"],"UserID":"163887529","Username":"mistercbs","Videos":null,"Views":61,"SensitiveContent":false},{"ConversationID":"1797285805158785293","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/2gf6jmA6yP\u003c/a\u003e","ID":"1797285805158785293","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"SashaT|Braavos Mod⭐️MySwap Mod ⭐️ZetaChaine VIP","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/sshaT86/status/1797285805158785293","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/2gf6jmA6yP","Thread":null,"TimeParsed":"2024-06-02T15:15:02Z","Timestamp":1717341302,"URLs":["http://app.masa.ai/staking"],"UserID":"1535333110434385922","Username":"sshaT86","Videos":null,"Views":57,"SensitiveContent":false},{"ConversationID":"1796837723636117573","GIFs":null,"Hashtags":null,"HTML":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. \u003ca href=\"https://twitter.com/getmasafi\"\u003e@getmasafi\u003c/a\u003e \u003ca href=\"http://app.masa.ai/staking\"\u003ehttps://t.co/0MqivHywAy\u003c/a\u003e","ID":"1796837723636117573","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"Tottitti $Lingo | STONE πŸ¦β€β¬›πŸͺ¨ ♣️♦️","Mentions":[{"ID":"1419111693112676353","Username":"getmasafi","Name":"Masa"}],"PermanentURL":"https://twitter.com/tottitti9/status/1796837723636117573","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"I just successfully staked my $MASA Tokens. It’s super easy. Choose your lock-up time and earn up to 25% APY in MASA rewards. @getmasafi https://t.co/0MqivHywAy","Thread":null,"TimeParsed":"2024-06-01T09:34:31Z","Timestamp":1717234471,"URLs":["http://app.masa.ai/staking"],"UserID":"1000765235211386880","Username":"tottitti9","Videos":null,"Views":48,"SensitiveContent":false},{"ConversationID":"1796651254048760256","GIFs":null,"Hashtags":null,"HTML":"Lately I've had some friends asking questions on how to trade $MASA tokens to Base ETH which can easily be sent to any CEX of your choice.\u003cbr\u003e\u003cbr\u003eHere, I will take it bit by bit to explain the process via \u003ca href=\"https://twitter.com/Uniswap\"\u003e@Uniswap\u003c/a\u003e in this 🧡 ....let's go 😎","ID":"1796651254048760256","InReplyToStatus":null,"InReplyToStatusID":"","IsQuoted":false,"IsPin":false,"IsReply":false,"IsRetweet":false,"IsSelfThread":false,"Likes":0,"Name":"FRANKSTAINZ.SOL πŸ•‹ πŸͺπŸ‡«πŸ‡·πŸͺ","Mentions":[{"ID":"984188226826010624","Username":"Uniswap","Name":"Uniswap Labs πŸ¦„"}],"PermanentURL":"https://twitter.com/marcelokpe/status/1796651254048760256","Photos":null,"Place":null,"QuotedStatus":null,"QuotedStatusID":"","Replies":0,"Retweets":0,"RetweetedStatus":null,"RetweetedStatusID":"","Text":"Lately I've had some friends asking questions on how to trade $MASA tokens to Base ETH which can easily be sent to any CEX of your choice.\n\nHere, I will take it bit by bit to explain the process via @Uniswap in this 🧡 ....let's go 😎","Thread":null,"TimeParsed":"2024-05-31T21:13:33Z","Timestamp":1717190013,"URLs":null,"UserID":"1448419864289366028","Username":"marcelokpe","Videos":null,"Views":48,"SensitiveContent":false}] \ No newline at end of file From 5c66d87d81df0e84a8a1e8b53065859397fa31b9 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 2 Jul 2024 12:19:39 -0400 Subject: [PATCH 02/36] bugfix #46 --- pkg/workers/workers.go | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index df7deacf..06eb0c4e 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -443,7 +443,54 @@ func MonitorWorkers(ctx context.Context, node *masa.OracleNode) { logrus.Debugf("Error processing data.ValidatorData: %v", data.ValidatorData) } +<<<<<<< HEAD processValidatorData(data, validatorDataMap, &startTime, node) +======= + if validatorDataMap, ok := data.ValidatorData.(map[string]interface{}); ok { + if response, ok := validatorDataMap["Response"].(map[string]interface{}); ok { + if _, ok := response["error"].(string); ok { + logrus.Infof("[+] Work failed %s", response["error"]) + } else if work, ok := response["data"].(string); ok { + key, _ := computeCid(work) + logrus.Infof("[+] Work completed -> %s", key) + + endTime := time.Now() + duration := endTime.Sub(startTime) + + workEvent := db.WorkEvent{ + CID: key, + PeerId: data.ID, + Payload: []byte(work), + Duration: duration.Seconds(), + Timestamp: time.Now().Unix(), + } + + updateRecords(node, workEvent) + } else if w, ok := response["data"].(map[string]interface{}); ok { + work, err := json.Marshal(w) + if err != nil { + logrus.Errorf("Error marshalling data.ValidatorData: %v", err) + continue + } + key, _ := computeCid(string(work)) + logrus.Infof("[+] Work done %s", key) + + endTime := time.Now() + duration := endTime.Sub(startTime) + + workEvent := db.WorkEvent{ + CID: key, + PeerId: data.ID, + Payload: work, + Duration: duration.Seconds(), + Timestamp: time.Now().Unix(), + } + + updateRecords(node, workEvent) + } + } + } +>>>>>>> 22b5207 (bugfix #46) case <-ctx.Done(): return } From e41c17e490119c72232b22376795c335a029a043 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 2 Jul 2024 15:23:31 -0400 Subject: [PATCH 03/36] removed obsolete funcs and updated comments and e2e for all branches --- .github/workflows/e2e.yaml | 5 ++- cmd/masa-node/main.go | 2 +- pkg/chain/block.go | 4 +-- pkg/pubsub/node_event_tracker.go | 55 -------------------------------- pkg/pubsub/safe_map.go | 39 ---------------------- pkg/pubsub/worker_tracker.go | 2 +- 6 files changed, 6 insertions(+), 101 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index a08b16f9..674922be 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -3,11 +3,10 @@ name: Go on: push: branches: - - test + - '**' pull_request: branches: - - test - + - '**' jobs: test: runs-on: ubuntu-latest diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index a053a22b..131b76a0 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -88,7 +88,7 @@ func main() { // Init cache resolver go db.InitResolverCache(node, keyManager) - // Subscribe to blocks -- moving to new ticket + // Subscribe to blocks go masa.SubscribeToBlocks(ctx, node) // Subscribe and if actor start monitoring actor workers diff --git a/pkg/chain/block.go b/pkg/chain/block.go index edebeca5..83b9501d 100644 --- a/pkg/chain/block.go +++ b/pkg/chain/block.go @@ -12,8 +12,8 @@ import ( type Block struct { Data []byte // this block's data Hash []byte // this block's hash - Link []byte // the hash of the last block in the chain. this is the key part that links the blocks together - Nonce int64 // the nonce used to sing the block for verification + Link []byte // the hash of the last block in the chain + Nonce int64 // the nonce used to sign the block for verification } func (b *Block) Build(data []byte, link []byte, stake *big.Int) { diff --git a/pkg/pubsub/node_event_tracker.go b/pkg/pubsub/node_event_tracker.go index f67b9032..20eecaca 100644 --- a/pkg/pubsub/node_event_tracker.go +++ b/pkg/pubsub/node_event_tracker.go @@ -3,8 +3,6 @@ package pubsub import ( "encoding/json" "fmt" - "os" - "path/filepath" "sort" "time" @@ -14,7 +12,6 @@ import ( ma "github.com/multiformats/go-multiaddr" "github.com/sirupsen/logrus" - "github.com/masa-finance/masa-oracle/pkg/config" "github.com/masa-finance/masa-oracle/pkg/masacrypto" ) @@ -41,10 +38,6 @@ func NewNodeEventTracker(version, environment string) *NodeEventTracker { nodeDataFile: fmt.Sprintf("%s_%s_node_data.json", version, environment), ConnectBuffer: make(map[string]ConnectBufferEntry), } - // err := net.LoadNodeData() - // if err != nil { - // logrus.Error("Error loading node data", err) - // } go net.ClearExpiredBufferEntries() return net } @@ -253,54 +246,6 @@ func (net *NodeEventTracker) GetUpdatedNodes(since time.Time) []NodeData { return updatedNodeData } -// DumpNodeData writes the NodeData map to a JSON file. It determines the file path -// based on the configured data directory, defaulting to nodeDataFile if not set. -// It logs any errors writing the file. This allows periodically persisting the -// node data. -// @note Obsoleted -func (net *NodeEventTracker) DumpNodeData() { - // Write the JSON data to a file - var filePath string - dataDir := config.GetInstance().MasaDir - if dataDir == "" { - filePath = net.nodeDataFile - } else { - filePath = filepath.Join(dataDir, net.nodeDataFile) - } - logrus.Infof("writing node data to file: %s", filePath) - err := net.nodeData.DumpNodeData(filePath) - if err != nil { - logrus.Error("could not dump node data", err) - } -} - -// LoadNodeData loads the node data from a JSON file. It determines the file path -// based on the configured data directory, defaulting to nodeDataFile if not set. -// It logs any errors reading or parsing the file. This allows initializing the -// node data tracker from persisted data. -// @note Obsoleted -func (net *NodeEventTracker) LoadNodeData() error { - // Read the JSON data from a file - var filePath string - dataDir := config.GetInstance().MasaDir - if dataDir == "" { - filePath = net.nodeDataFile - } else { - filePath = filepath.Join(dataDir, net.nodeDataFile) - } - // Check if the file exists - if _, err := os.Stat(filePath); os.IsNotExist(err) { - logrus.Warn(fmt.Sprintf("file does not exist: %s", filePath)) - return nil - } - err := net.nodeData.LoadNodeData(filePath) - if err != nil { - logrus.Error("could not load node data", err) - return err - } - return nil -} - // GetEthAddress returns the Ethereum address for the given remote peer. // It gets the peer's public key from the network's peerstore, converts // it to a hex string, and converts that to an Ethereum address. diff --git a/pkg/pubsub/safe_map.go b/pkg/pubsub/safe_map.go index ad6b573f..90bf9d89 100644 --- a/pkg/pubsub/safe_map.go +++ b/pkg/pubsub/safe_map.go @@ -3,7 +3,6 @@ package pubsub import ( "encoding/json" "fmt" - "os" "sort" "sync" "time" @@ -94,44 +93,6 @@ func (sm *SafeMap) UnmarshalJSON(b []byte) error { return json.Unmarshal(b, &sm.items) } -// DumpNodeData writes the entire nodeData map to a file in JSON format. -// @note Obsoleted -func (sm *SafeMap) DumpNodeData(filePath string) error { - sm.mu.RLock() - defer sm.mu.RUnlock() - - data, err := json.Marshal(sm.items) - if err != nil { - return fmt.Errorf("could not marshal node data: %w", err) - } - - err = os.WriteFile(filePath, data, 0644) - if err != nil { - return fmt.Errorf("could not write to file: %s, error: %w", filePath, err) - } - - return nil -} - -// LoadNodeData reads nodeData from a file in JSON format and loads it into the map. -// @note Obsoleted -func (sm *SafeMap) LoadNodeData(filePath string) error { - sm.mu.Lock() - defer sm.mu.Unlock() - - data, err := os.ReadFile(filePath) - if err != nil { - return fmt.Errorf("could not read from file: %s, error: %w", filePath, err) - } - - err = json.Unmarshal(data, &sm.items) - if err != nil { - return fmt.Errorf("could not unmarshal JSON data: %w", err) - } - - return nil -} - // PrettyDuration takes a time.Duration and returns a string representation // rounded to the nearest minute. It will include the number of days, hours, // and minutes as applicable. For example: diff --git a/pkg/pubsub/worker_tracker.go b/pkg/pubsub/worker_tracker.go index 82988e28..e98ebbcc 100644 --- a/pkg/pubsub/worker_tracker.go +++ b/pkg/pubsub/worker_tracker.go @@ -26,7 +26,7 @@ type WorkerEventTracker struct { // HandleMessage implements subscription WorkerEventTracker handler func (h *WorkerEventTracker) HandleMessage(m *pubsub.Message) { - logrus.Infof("workerStream -> Received work from: %s", m.ReceivedFrom) + // logrus.Infof("workerStream -> Received work from: %s", m.ReceivedFrom) var workers Workers err := json.Unmarshal(m.Data, &workers) if err != nil { From 14862ebaa90f3068542907369d8080a2e8fdf41a Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 2 Jul 2024 15:28:59 -0400 Subject: [PATCH 04/36] updated host.Addrs() due to dependabot update --- pkg/network/discover.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/network/discover.go b/pkg/network/discover.go index 11ab3068..f5d0337f 100644 --- a/pkg/network/discover.go +++ b/pkg/network/discover.go @@ -97,8 +97,9 @@ func Discover(ctx context.Context, host host.Host, dht *dht.IpfsDHT, protocol pr Addrs: availPeer.Addrs, } hostAddrInfo := peer.AddrInfo{ - ID: host.ID(), - Addrs: []multiaddr.Multiaddr{}, + ID: host.ID(), + //Addrs: []multiaddr.Multiaddr{}, + Addrs: host.Addrs(), } if availPeerAddrInfo.ID.String() == hostAddrInfo.ID.String() { logrus.Debugf("Skipping connect to self: %s", availPeerAddrInfo.ID.String()) From e5f315d05e499a6cd48f8b5c287b33332342ef44 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 2 Jul 2024 15:31:28 -0400 Subject: [PATCH 05/36] removed comment --- cmd/masa-node/main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 131b76a0..24cbadcc 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -111,7 +111,6 @@ func main() { if nodeData != nil { nodeData.Left() } - // node.NodeTracker.DumpNodeData() cancel() }() From fd0796de5f641676007da949f080d6632662ab54 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 2 Jul 2024 19:20:27 -0400 Subject: [PATCH 06/36] bugfix check isworker --- cmd/masa-node/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 24cbadcc..23524f32 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -97,7 +97,9 @@ func main() { // if this peer can or cannot scrape or write that is checked in other places if node.IsStaked { go workers.SubscribeToWorkers(node) - go workers.MonitorWorkers(ctx, node) + if node.IsWorker() { + go workers.MonitorWorkers(ctx, node) + } } // Listen for SIGINT (CTRL+C) From 5a35999a6403609192c6bf4fb17e1247377c03b8 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 2 Jul 2024 19:26:21 -0400 Subject: [PATCH 07/36] removed uneeded check --- cmd/masa-node/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 23524f32..24cbadcc 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -97,9 +97,7 @@ func main() { // if this peer can or cannot scrape or write that is checked in other places if node.IsStaked { go workers.SubscribeToWorkers(node) - if node.IsWorker() { - go workers.MonitorWorkers(ctx, node) - } + go workers.MonitorWorkers(ctx, node) } // Listen for SIGINT (CTRL+C) From 7516f90e280e624eb5480972a8aaef57f47389b0 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Wed, 3 Jul 2024 12:21:39 -0400 Subject: [PATCH 08/36] updated makefile --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5321c4a0..923c4f8c 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,8 @@ test: clean: @rm -rf bin @rm masa_node.log - + @rm -rf ~/.masa/cache + proto: sh pkg/workers/messages/build.sh From 3b4a6bae9829fea13e2d0eb06d677b5efae3cece Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 4 Jul 2024 12:24:04 -0400 Subject: [PATCH 09/36] updated pkgs --- cmd/masa-node/main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 24cbadcc..49777f98 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -87,9 +87,7 @@ func main() { } // Init cache resolver - go db.InitResolverCache(node, keyManager) - // Subscribe to blocks - go masa.SubscribeToBlocks(ctx, node) + db.InitResolverCache(node, keyManager) // Subscribe and if actor start monitoring actor workers // considering all that matters is if the node is staked @@ -128,5 +126,8 @@ func main() { // Display the welcome message with the multiaddress and IP address config.DisplayWelcomeMessage(multiAddr, ipAddr, keyManager.EthAddress, isStaked, isValidator, cfg.TwitterScraper, cfg.DiscordScraper, cfg.WebScraper, config.Version) + // Subscribe to blocks + masa.SubscribeToBlocks(ctx, node) + <-ctx.Done() } From 58f903d4610fb55ab01ec57382dae0fd455286ae Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 9 Jul 2024 12:08:10 -0400 Subject: [PATCH 10/36] linted md --- docs/worker-node/discord-worker.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/worker-node/discord-worker.md b/docs/worker-node/discord-worker.md index 7939aaf5..2cf29540 100644 --- a/docs/worker-node/discord-worker.md +++ b/docs/worker-node/discord-worker.md @@ -38,7 +38,6 @@ To start processing Discord data requests, you need to retrieve your Discord bot 5 . Confirm the creation of the bot user. 6 . Under the "TOKEN" section, click on "Copy" to get your bot token. - ### Adding Discord Credentials 1 . Locate your `.env` file in your Masa Oracle Node's directory. From 6b743a9294a39c943d6cb6d586c26f4b75a7737d Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 9 Jul 2024 16:55:44 -0400 Subject: [PATCH 11/36] stos3 --- pkg/db/operations.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/pkg/db/operations.go b/pkg/db/operations.go index c0fd92c3..53fedd44 100644 --- a/pkg/db/operations.go +++ b/pkg/db/operations.go @@ -1,9 +1,13 @@ package db import ( + "bytes" "context" "encoding/json" "fmt" + "io" + "net/http" + "os" "time" masa "github.com/masa-finance/masa-oracle/pkg" @@ -97,3 +101,43 @@ func ReadData(node *masa.OracleNode, key string) ([]byte, error) { return val, nil } + +func SendToS3(uid string, payload map[string]string) error { + + apiURL := os.Getenv("API_URL") + authToken := "your-secret-token" + + // Creating the JSON payload + // payload := map[string]string{ + // "key1": "value1", + // "key2": "value2", + // } + + jsonPayload, err := json.Marshal(payload) + if err != nil { + return fmt.Errorf("failed to marshal JSON payload: %v", err) + } + + req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(jsonPayload)) + if err != nil { + return fmt.Errorf("failed to create HTTP request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", authToken) + + // Send the request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("failed to send HTTP request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + bodyBytes, _ := io.ReadAll(resp.Body) + return fmt.Errorf("received non-OK response: %s, body: %s", resp.Status, string(bodyBytes)) + } + + return nil +} From 4bf1c8f7750b3e6b313f0830d60e4a98f492073a Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 08:59:44 -0400 Subject: [PATCH 12/36] debug --- docs/oracle-node/quickstart.md | 4 +-- docs/worker-node/quickstart.md | 4 +-- go.mod | 4 +++ go.sum | 9 +++++ pkg/api/handlers_node.go | 2 +- pkg/api/routes.go | 2 +- pkg/oracle_node.go | 66 ++++++++++++++++++++++++++++++++++ 7 files changed, 85 insertions(+), 6 deletions(-) diff --git a/docs/oracle-node/quickstart.md b/docs/oracle-node/quickstart.md index 14b64d92..fae4d0a8 100644 --- a/docs/oracle-node/quickstart.md +++ b/docs/oracle-node/quickstart.md @@ -86,7 +86,7 @@ Is Validator: false Is TwitterScraper: false Is WebScraper: false INFO[0001] Peer added to DHT: 16Uiu2HAmHpx13GPKZAP3WpgpYkZ39M5cwuvmXS5gGvrsa5ofLNoq -INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.2-beta-dev +INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.9-beta-dev ``` ### 6. Stake the node with 1000 Sepolia MASA minimum @@ -139,7 +139,7 @@ Is Validator: false Is TwitterScraper: false Is WebScraper: false INFO[0001] Peer added to DHT: 16Uiu2HAmHpx13GPKZAP3WpgpYkZ39M5cwuvmXS5gGvrsa5ofLNoq -INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.2-beta-dev +INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.9-beta-dev ``` ### 7. View swagger API diff --git a/docs/worker-node/quickstart.md b/docs/worker-node/quickstart.md index de407198..0c84d2db 100644 --- a/docs/worker-node/quickstart.md +++ b/docs/worker-node/quickstart.md @@ -86,7 +86,7 @@ Is Validator: false Is TwitterScraper: false Is WebScraper: false INFO[0001] Peer added to DHT: 16Uiu2HAmHpx13GPKZAP3WpgpYkZ39M5cwuvmXS5gGvrsa5ofLNoq -INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.2-beta-dev +INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.9-beta-dev ``` ### 6. Stake the node with 1000 Sepolia MASA minimum @@ -139,7 +139,7 @@ Is Validator: false Is TwitterScraper: false Is WebScraper: false INFO[0001] Peer added to DHT: 16Uiu2HAmHpx13GPKZAP3WpgpYkZ39M5cwuvmXS5gGvrsa5ofLNoq -INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.2-beta-dev +INFO[0005] Successfully advertised protocol /masa/oracle_protocol/v0.0.9-beta-dev ``` ### 7. View swagger API diff --git a/go.mod b/go.mod index 42544541..b25abc82 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-leveldb v0.5.0 + github.com/ipfs/go-ipfs-api v0.7.0 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 github.com/libp2p/go-libp2p v0.34.0 @@ -56,6 +57,7 @@ require ( github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.13.0 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/bytedance/sonic v1.11.6 // indirect @@ -69,6 +71,7 @@ require ( github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect @@ -155,6 +158,7 @@ require ( github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.1 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect diff --git a/go.sum b/go.sum index 8fe049a8..e3efbabb 100644 --- a/go.sum +++ b/go.sum @@ -51,6 +51,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= @@ -70,6 +72,8 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chyeh/pubip v0.0.0-20170203095919-b7e679cf541c h1:++BhWlmSX+n8m3O4gPfy3S4PTZ0TMzH6nelerBLPUng= github.com/chyeh/pubip v0.0.0-20170203095919-b7e679cf541c/go.mod h1:C7ma6h458jTWT65mXC58L1Q6hnEtr0unur8cMc0UEXM= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= @@ -110,6 +114,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 h1:ZFUue+PNxmHlu7pYv+IYMtqlaO/0VwaGEqKepZf9JpA= +github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= @@ -335,6 +341,8 @@ github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ipfs-api v0.7.0 h1:CMBNCUl0b45coC+lQCXEVpMhwoqjiaCwUIrM+coYW2Q= +github.com/ipfs/go-ipfs-api v0.7.0/go.mod h1:AIxsTNB0+ZhkqIfTZpdZ0VR/cpX5zrXjATa3prSay3g= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= @@ -472,6 +480,7 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8Rv github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= diff --git a/pkg/api/handlers_node.go b/pkg/api/handlers_node.go index 8738c468..1d4ae801 100644 --- a/pkg/api/handlers_node.go +++ b/pkg/api/handlers_node.go @@ -63,7 +63,7 @@ func (api *API) GetNodeDataHandler() gin.HandlerFunc { "success": true, "data": nodeDataPage.Data, "pageNbr": nodeDataPage.PageNumber, - "total": nodeDataPage.TotalRecords, + "total": nodeDataPage.TotalPages, "totalRecords": nodeDataPage.TotalRecords, }) } diff --git a/pkg/api/routes.go b/pkg/api/routes.go index 13b7b772..aec39add 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -134,7 +134,7 @@ func SetupRoutes(node *masa.OracleNode) *gin.Engine { // @Title Masa API // @Description The Worlds Personal Data Network Masa Oracle Node API // @Host https://api.masa.ai - // @Version 0.0.9-beta + // @Version 0.5.0 // @contact.name Masa API Support // @contact.url https://masa.ai // @contact.email support@masa.ai diff --git a/pkg/oracle_node.go b/pkg/oracle_node.go index 3cf03045..b252ba44 100644 --- a/pkg/oracle_node.go +++ b/pkg/oracle_node.go @@ -7,6 +7,7 @@ import ( "io" "log/slog" "net" + "os" "strconv" "strings" "time" @@ -29,6 +30,7 @@ import ( "github.com/multiformats/go-multiaddr" "github.com/sirupsen/logrus" + shell "github.com/ipfs/go-ipfs-api" pubsub "github.com/libp2p/go-libp2p-pubsub" chain "github.com/masa-finance/masa-oracle/pkg/chain" "github.com/masa-finance/masa-oracle/pkg/config" @@ -374,6 +376,70 @@ func SubscribeToBlocks(ctx context.Context, node *OracleNode) { return } + // if validator=true + // do i have the block? + // am i the validator that creates the block + // how do i sync the blocks to others or from others + + // save block to ipfs + // get from ipfs + // cid -> stored in node data, chain data, txns [] base58 0x... + + // timestamp := time.Now() + // formattedTimestamp := timestamp.UnixNano() + // filename := fmt.Sprintf("%v", formattedTimestamp) + + // file, err := os.Create(filename) + // if err != nil { + // logrus.Info("Error opening file:", err) + // return + // } + // defer file.Close() + + // _, err = file.WriteString("masa protocol") + // if err != nil { + // logrus.Info("Error writing to file:", err) + // return + // } + + // err = file.Sync() + // if err != nil { + // logrus.Info("Error flushing file:", err) + // } + + projectID := "2K3UB2DxNThAJ7fYiFMeOBnaCiC" + projectSecret := "cca72847ab42243af3f2691018046bb3" + infuraURL := fmt.Sprintf("https://%s:%s@dwn.infura-ipfs.io:5001", projectID, projectSecret) + + sh := shell.NewShell(infuraURL) + + file, err := os.Open("README.md") + if err != nil { + logrus.Errorf("Error opening file: %s", err) + os.Exit(1) + } + defer file.Close() + + hash, err := sh.AddWithOpts(file, true, true) + if err != nil { + logrus.Errorf("Error adding file to IPFS: %s", err) + os.Exit(1) + } + + // err = sh.Pin(hash) + // if err != nil { + // logrus.Errorf("Error pinning file to IPFS: %s", err) + // os.Exit(1) + // } + + // err = sh.FilesCp(ctx, "/ipfs/"+hash, "/"+filename) + // if err != nil { + // logrus.Errorf("Error copying file to MFS: %s", err) + // os.Exit(1) + // } + + logrus.Printf("File added successfully. IPFS hash: %s\n", hash) + go node.Blockchain.Init() ticker := time.NewTicker(time.Second * 10) From 576626e41a4091eaa7bd3eed90fa7ba6dfb49d89 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 12:32:22 -0400 Subject: [PATCH 13/36] test panic bug fix --- cmd/masa-node/main.go | 2 +- pkg/oracle_node.go | 179 +++++++++++++++++++++++++++++------------- 2 files changed, 124 insertions(+), 57 deletions(-) diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 49777f98..650d0166 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -127,7 +127,7 @@ func main() { config.DisplayWelcomeMessage(multiAddr, ipAddr, keyManager.EthAddress, isStaked, isValidator, cfg.TwitterScraper, cfg.DiscordScraper, cfg.WebScraper, config.Version) // Subscribe to blocks - masa.SubscribeToBlocks(ctx, node) + // masa.SubscribeToBlocks(ctx, node) <-ctx.Done() } diff --git a/pkg/oracle_node.go b/pkg/oracle_node.go index b252ba44..2eebc739 100644 --- a/pkg/oracle_node.go +++ b/pkg/oracle_node.go @@ -1,8 +1,10 @@ package masa import ( + "bytes" "context" "crypto/ecdsa" + "encoding/json" "fmt" "io" "log/slog" @@ -363,6 +365,36 @@ var ( blocksCh = make(chan *pubsub.Message) ) +// func (node *OracleNode) QueryAllDHTObjects(ctx context.Context) (map[string][]byte, error) { +// results := make(map[string][]byte) + +// // Get all peers from the DHT +// peers, err := node.DHT.GetClosestPeers(ctx, "/db") +// if err != nil { +// return nil, fmt.Errorf("failed to get peers: %v", err) +// } + +// // Iterate through all peers +// for peer := range peers { +// // Get all providers for this peer +// providers := node.DHT.FindProvidersAsync(ctx, peer, 0) + +// // Iterate through all providers +// for provider := range providers { +// // Get the value for this provider +// value, err := node.DHT.GetValue(ctx, fmt.Sprintf("/db/%s", provider.ID.String())) +// if err != nil { +// logrus.Warnf("Failed to get value for peer %s: %v", provider.ID.String(), err) +// continue +// } + +// results[provider.ID.String()] = value +// } +// } + +// return results, nil +// } + // SubscribeToBlocks is a function that takes in a context and an OracleNode as parameters. // It is used to subscribe the given OracleNode to the blockchain blocks. func SubscribeToBlocks(ctx context.Context, node *OracleNode) { @@ -376,70 +408,40 @@ func SubscribeToBlocks(ctx context.Context, node *OracleNode) { return } - // if validator=true - // do i have the block? - // am i the validator that creates the block - // how do i sync the blocks to others or from others + if os.Getenv("IPFS_URL") != "" { - // save block to ipfs - // get from ipfs - // cid -> stored in node data, chain data, txns [] base58 0x... + infuraURL := fmt.Sprintf("https://%s:%s@%s", os.Getenv("PID"), os.Getenv("PS"), os.Getenv("IPFS_URL")) + sh := shell.NewShell(infuraURL) - // timestamp := time.Now() - // formattedTimestamp := timestamp.UnixNano() - // filename := fmt.Sprintf("%v", formattedTimestamp) - - // file, err := os.Create(filename) - // if err != nil { - // logrus.Info("Error opening file:", err) - // return - // } - // defer file.Close() - - // _, err = file.WriteString("masa protocol") - // if err != nil { - // logrus.Info("Error writing to file:", err) - // return - // } - - // err = file.Sync() - // if err != nil { - // logrus.Info("Error flushing file:", err) - // } + type MyJSONObject struct { + Name string `json:"name"` + Age int `json:"age"` + } + jsonObj := MyJSONObject{ + Name: "Jane Doe", + Age: 56, + } + jsonBytes, err := json.Marshal(jsonObj) + if err != nil { + logrus.Errorf("Error marshalling JSON: %s", err) + } - projectID := "2K3UB2DxNThAJ7fYiFMeOBnaCiC" - projectSecret := "cca72847ab42243af3f2691018046bb3" - infuraURL := fmt.Sprintf("https://%s:%s@dwn.infura-ipfs.io:5001", projectID, projectSecret) + reader := bytes.NewReader(jsonBytes) - sh := shell.NewShell(infuraURL) + hash, err := sh.AddWithOpts(reader, true, true) + if err != nil { + logrus.Errorf("Error adding file to IPFS: %s", err) + os.Exit(1) + } - file, err := os.Open("README.md") - if err != nil { - logrus.Errorf("Error opening file: %s", err) - os.Exit(1) - } - defer file.Close() + logrus.Printf("File added successfully. IPFS hash: %s\n", hash) - hash, err := sh.AddWithOpts(file, true, true) - if err != nil { - logrus.Errorf("Error adding file to IPFS: %s", err) - os.Exit(1) + e := sh.Get(hash, "testo.txt") + if e != nil { + logrus.Errorf("Error getting file from IPFS: %s", e) + } } - // err = sh.Pin(hash) - // if err != nil { - // logrus.Errorf("Error pinning file to IPFS: %s", err) - // os.Exit(1) - // } - - // err = sh.FilesCp(ctx, "/ipfs/"+hash, "/"+filename) - // if err != nil { - // logrus.Errorf("Error copying file to MFS: %s", err) - // os.Exit(1) - // } - - logrus.Printf("File added successfully. IPFS hash: %s\n", hash) - go node.Blockchain.Init() ticker := time.NewTicker(time.Second * 10) @@ -449,6 +451,47 @@ func SubscribeToBlocks(ctx context.Context, node *OracleNode) { select { case <-ticker.C: logrus.Debug("tick") + + // peerInfos := node.DHT.RoutingTable().GetPeerInfos() + // if len(peerInfos) > 0 { + // for i, peerInfo := range peerInfos { + // fmt.Printf("Peer %d:\n", i+1) + // fmt.Printf(" PeerID: %s\n", peerInfo.Id) + // fmt.Printf(" Last Success: %v\n", peerInfo.LastSuccessfulOutboundQueryAt) + // fmt.Printf(" Added At: %v\n", peerInfo.AddedAt) + // fmt.Println("---") + // } + // } else { + // fmt.Println("No peers in the routing table") + // } + + // var routingDiscovery *routing.RoutingDiscovery + // protocolString := string(node.Protocol) + // logrus.Infof("Discovering peers for protocol: %s", protocolString) + + // routingDiscovery = routing.NewRoutingDiscovery(node.DHT) + + // peerChan, _ := routingDiscovery.FindPeers(ctx, protocolString) + // p := <-peerChan + // fmt.Println("peerChan", p.ID.String()) + + // v, _ := node.DHT.GetValue(ctx, "/db/"+p.ID.String()) + // fmt.Println("value", string(v)) + + // select { + // case availPeer, ok := <-peerChan: + // if ok { + // fmt.Println("availPeer", availPeer) + // } + // } + + // peers, _ := node.DHT.GetClosestPeers(ctx, "/db/"+p.ID.String()) + // peers := node.NodeTracker.GetAllNodeData() + // peers := node.Host.Network().Peers() + // for peer := range peers { + // logrus.Info("peer -->", peer) + // } + case block := <-node.BlockTracker.BlocksCh: _ = node.Blockchain.AddBlock(block.Data) if node.Blockchain.LastHash != nil { @@ -457,6 +500,30 @@ func SubscribeToBlocks(ctx context.Context, node *OracleNode) { logrus.Errorf("Blockchain.GetBlock err: %v", e) } b.Print() + + // type BlockData struct { + // InputData string `json:"input_data"` + // TransactionHash string `json:"transaction_hash"` + // PreviousHash string `json:"previous_hash"` + // TransactionNonce int `json:"transaction_nonce"` + // } + + // blockData := BlockData{ + // InputData: string(b.Data), + // TransactionHash: fmt.Sprintf("%x", b.Hash), + // PreviousHash: fmt.Sprintf("%x", b.Link), + // TransactionNonce: int(b.Nonce), + // } + + // blockDataJSON, err := json.Marshal(blockData) + // if err != nil { + // logrus.Errorf("Error marshalling block data: %v", err) + // } + + // err = node.DHT.PutValue(ctx, "/db/"+blockData.TransactionHash, blockDataJSON) + // if err != nil { + // logrus.Errorf("Error storing block on DHT: %v", err) + // } } case <-ctx.Done(): From 065191143bb3493d52f814b28e094ec0559854ad Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 16:05:25 -0400 Subject: [PATCH 14/36] block persistance phase 1 --- cmd/masa-node/main.go | 2 +- pkg/api/handlers_node.go | 27 ++++++ pkg/db/resolver_cache.go | 36 ++++++++ pkg/oracle_node.go | 175 ++++++++++++++------------------------- 4 files changed, 124 insertions(+), 116 deletions(-) diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 650d0166..49777f98 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -127,7 +127,7 @@ func main() { config.DisplayWelcomeMessage(multiAddr, ipAddr, keyManager.EthAddress, isStaked, isValidator, cfg.TwitterScraper, cfg.DiscordScraper, cfg.WebScraper, config.Version) // Subscribe to blocks - // masa.SubscribeToBlocks(ctx, node) + masa.SubscribeToBlocks(ctx, node) <-ctx.Done() } diff --git a/pkg/api/handlers_node.go b/pkg/api/handlers_node.go index 1d4ae801..d537c916 100644 --- a/pkg/api/handlers_node.go +++ b/pkg/api/handlers_node.go @@ -455,3 +455,30 @@ func (api *API) GetNodeApiKey() gin.HandlerFunc { }) } } + +// wip +// peerInfos := node.DHT.RoutingTable().GetPeerInfos() +// if len(peerInfos) > 0 { +// for i, peerInfo := range peerInfos { +// fmt.Printf("Peer %d:\n", i+1) +// fmt.Printf(" PeerID: %s\n", peerInfo.Id) +// fmt.Printf(" Last Success: %v\n", peerInfo.LastSuccessfulOutboundQueryAt) +// fmt.Printf(" Added At: %v\n", peerInfo.AddedAt) +// fmt.Println("---") +// } +// } else { +// fmt.Println("No peers in the routing table") +// } + +// var routingDiscovery *routing.RoutingDiscovery +// protocolString := string(node.Protocol) +// logrus.Infof("Discovering peers for protocol: %s", protocolString) + +// routingDiscovery = routing.NewRoutingDiscovery(node.DHT) + +// peerChan, _ := routingDiscovery.FindPeers(ctx, protocolString) +// p := <-peerChan +// fmt.Println("peerChan", p.ID.String()) + +// v, _ := node.DHT.GetValue(ctx, "/db/"+p.ID.String()) +// fmt.Println("value", string(v)) diff --git a/pkg/db/resolver_cache.go b/pkg/db/resolver_cache.go index 848fc012..fc493c34 100644 --- a/pkg/db/resolver_cache.go +++ b/pkg/db/resolver_cache.go @@ -200,6 +200,42 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { } logrus.Printf("syncing record %s", key) _ = WriteData(node, key, record.Value) + + // sync blocks + blocks, _ := node.DHT.GetValue(ctx, "/db/blocks") + var blockData map[string]interface{} + err := json.Unmarshal(blocks, &blockData) + if err != nil { + logrus.Errorf("Error unmarshalling block data: %v", err) + } else { + if message, ok := blockData["message"].(map[string]interface{}); ok { + if blockData, ok := message["block_data"].([]interface{}); ok { + blockDataBytes, err := json.Marshal(blockData) + if err != nil { + logrus.Errorf("Error marshalling block data: %v", err) + } else { + _ = WriteData(node, "blocks", blockDataBytes) + } + } else { + logrus.Errorf("Block data is not in the expected format") + } + } else { + logrus.Errorf("Block data does not contain a valid message") + } + } + // sync ipfs + ipfs, _ := node.DHT.GetValue(ctx, "/db/ipfs") + var ipfsData map[string]interface{} + err = json.Unmarshal(ipfs, &ipfsData) + if err != nil { + logrus.Errorf("Error unmarshalling IPFS data: %v", err) + } else { + if message, ok := ipfsData["message"].(string); ok { + _ = WriteData(node, "ipfs", []byte(message)) + } else { + logrus.Errorf("IPFS data does not contain a valid message") + } + } } } diff --git a/pkg/oracle_node.go b/pkg/oracle_node.go index 2eebc739..50d98512 100644 --- a/pkg/oracle_node.go +++ b/pkg/oracle_node.go @@ -365,63 +365,60 @@ var ( blocksCh = make(chan *pubsub.Message) ) -// func (node *OracleNode) QueryAllDHTObjects(ctx context.Context) (map[string][]byte, error) { -// results := make(map[string][]byte) - -// // Get all peers from the DHT -// peers, err := node.DHT.GetClosestPeers(ctx, "/db") -// if err != nil { -// return nil, fmt.Errorf("failed to get peers: %v", err) -// } - -// // Iterate through all peers -// for peer := range peers { -// // Get all providers for this peer -// providers := node.DHT.FindProvidersAsync(ctx, peer, 0) - -// // Iterate through all providers -// for provider := range providers { -// // Get the value for this provider -// value, err := node.DHT.GetValue(ctx, fmt.Sprintf("/db/%s", provider.ID.String())) -// if err != nil { -// logrus.Warnf("Failed to get value for peer %s: %v", provider.ID.String(), err) -// continue -// } - -// results[provider.ID.String()] = value -// } -// } - -// return results, nil -// } +type BlockData struct { + InputData string `json:"input_data"` + TransactionHash string `json:"transaction_hash"` + PreviousHash string `json:"previous_hash"` + TransactionNonce int `json:"transaction_nonce"` +} -// SubscribeToBlocks is a function that takes in a context and an OracleNode as parameters. -// It is used to subscribe the given OracleNode to the blockchain blocks. -func SubscribeToBlocks(ctx context.Context, node *OracleNode) { - node.BlockTracker = &pubsub2.BlockEventTracker{BlocksCh: blocksCh} - err := node.PubSubManager.AddSubscription(config.TopicWithVersion(config.BlockTopic), node.BlockTracker, true) - if err != nil { - logrus.Errorf("Subscribe error %v", err) +type Blocks struct { + TransactionHash string `json:"transaction_hash"` + BlockData []BlockData `json:"block_data"` +} + +func updateBlocks(ctx context.Context, node *OracleNode, block *chain.Block) { + + blockData := BlockData{ + InputData: string(block.Data), + TransactionHash: fmt.Sprintf("%x", block.Hash), + PreviousHash: fmt.Sprintf("%x", block.Link), + TransactionNonce: int(block.Nonce), } - if !node.IsValidator { + exists, _ := node.DHT.GetValue(ctx, "/db/blocks") + + var existingBlocks Blocks + if exists != nil { + err := json.Unmarshal(exists, &existingBlocks) + if err != nil { + logrus.Errorf("Error unmarshalling existing block data: %v", err) + } + existingBlocks.BlockData = append(existingBlocks.BlockData, blockData) + } else { + existingBlocks = Blocks{ + TransactionHash: blockData.TransactionHash, + BlockData: []BlockData{blockData}, + } + } + + jsonData, err := json.Marshal(existingBlocks) + if err != nil { + logrus.Error(err) return } + err = node.DHT.PutValue(ctx, "/db/blocks", jsonData) + if err != nil { + logrus.Errorf("Error storing block on DHT: %v", err) + } + if os.Getenv("IPFS_URL") != "" { infuraURL := fmt.Sprintf("https://%s:%s@%s", os.Getenv("PID"), os.Getenv("PS"), os.Getenv("IPFS_URL")) sh := shell.NewShell(infuraURL) - type MyJSONObject struct { - Name string `json:"name"` - Age int `json:"age"` - } - jsonObj := MyJSONObject{ - Name: "Jane Doe", - Age: 56, - } - jsonBytes, err := json.Marshal(jsonObj) + jsonBytes, err := json.Marshal(jsonData) if err != nil { logrus.Errorf("Error marshalling JSON: %s", err) } @@ -430,16 +427,26 @@ func SubscribeToBlocks(ctx context.Context, node *OracleNode) { hash, err := sh.AddWithOpts(reader, true, true) if err != nil { - logrus.Errorf("Error adding file to IPFS: %s", err) + logrus.Errorf("Error persisting to IPFS: %s", err) os.Exit(1) } - logrus.Printf("File added successfully. IPFS hash: %s\n", hash) + logrus.Printf("Ledger persisted with IPFS hash: https://dwn.infura-ipfs.io/ipfs/%s\n", hash) + _ = node.DHT.PutValue(ctx, "/db/ipfs", []byte(fmt.Sprintf("https://dwn.infura-ipfs.io/ipfs/%s", hash))) + } +} - e := sh.Get(hash, "testo.txt") - if e != nil { - logrus.Errorf("Error getting file from IPFS: %s", e) - } +// SubscribeToBlocks is a function that takes in a context and an OracleNode as parameters. +// It is used to subscribe the given OracleNode to the blockchain blocks. +func SubscribeToBlocks(ctx context.Context, node *OracleNode) { + node.BlockTracker = &pubsub2.BlockEventTracker{BlocksCh: blocksCh} + err := node.PubSubManager.AddSubscription(config.TopicWithVersion(config.BlockTopic), node.BlockTracker, true) + if err != nil { + logrus.Errorf("Subscribe error %v", err) + } + + if !node.IsValidator { + return } go node.Blockchain.Init() @@ -452,46 +459,6 @@ func SubscribeToBlocks(ctx context.Context, node *OracleNode) { case <-ticker.C: logrus.Debug("tick") - // peerInfos := node.DHT.RoutingTable().GetPeerInfos() - // if len(peerInfos) > 0 { - // for i, peerInfo := range peerInfos { - // fmt.Printf("Peer %d:\n", i+1) - // fmt.Printf(" PeerID: %s\n", peerInfo.Id) - // fmt.Printf(" Last Success: %v\n", peerInfo.LastSuccessfulOutboundQueryAt) - // fmt.Printf(" Added At: %v\n", peerInfo.AddedAt) - // fmt.Println("---") - // } - // } else { - // fmt.Println("No peers in the routing table") - // } - - // var routingDiscovery *routing.RoutingDiscovery - // protocolString := string(node.Protocol) - // logrus.Infof("Discovering peers for protocol: %s", protocolString) - - // routingDiscovery = routing.NewRoutingDiscovery(node.DHT) - - // peerChan, _ := routingDiscovery.FindPeers(ctx, protocolString) - // p := <-peerChan - // fmt.Println("peerChan", p.ID.String()) - - // v, _ := node.DHT.GetValue(ctx, "/db/"+p.ID.String()) - // fmt.Println("value", string(v)) - - // select { - // case availPeer, ok := <-peerChan: - // if ok { - // fmt.Println("availPeer", availPeer) - // } - // } - - // peers, _ := node.DHT.GetClosestPeers(ctx, "/db/"+p.ID.String()) - // peers := node.NodeTracker.GetAllNodeData() - // peers := node.Host.Network().Peers() - // for peer := range peers { - // logrus.Info("peer -->", peer) - // } - case block := <-node.BlockTracker.BlocksCh: _ = node.Blockchain.AddBlock(block.Data) if node.Blockchain.LastHash != nil { @@ -501,29 +468,7 @@ func SubscribeToBlocks(ctx context.Context, node *OracleNode) { } b.Print() - // type BlockData struct { - // InputData string `json:"input_data"` - // TransactionHash string `json:"transaction_hash"` - // PreviousHash string `json:"previous_hash"` - // TransactionNonce int `json:"transaction_nonce"` - // } - - // blockData := BlockData{ - // InputData: string(b.Data), - // TransactionHash: fmt.Sprintf("%x", b.Hash), - // PreviousHash: fmt.Sprintf("%x", b.Link), - // TransactionNonce: int(b.Nonce), - // } - - // blockDataJSON, err := json.Marshal(blockData) - // if err != nil { - // logrus.Errorf("Error marshalling block data: %v", err) - // } - - // err = node.DHT.PutValue(ctx, "/db/"+blockData.TransactionHash, blockDataJSON) - // if err != nil { - // logrus.Errorf("Error storing block on DHT: %v", err) - // } + updateBlocks(ctx, node, b) } case <-ctx.Done(): From 32028994e7f197918d69c39d4cf5602ef7d9f295 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 16:38:27 -0400 Subject: [PATCH 15/36] debug logging --- pkg/db/resolver_cache.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/db/resolver_cache.go b/pkg/db/resolver_cache.go index fc493c34..e1a63900 100644 --- a/pkg/db/resolver_cache.go +++ b/pkg/db/resolver_cache.go @@ -206,13 +206,13 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { var blockData map[string]interface{} err := json.Unmarshal(blocks, &blockData) if err != nil { - logrus.Errorf("Error unmarshalling block data: %v", err) + logrus.Debugf("Error unmarshalling block data: %v", err) } else { if message, ok := blockData["message"].(map[string]interface{}); ok { if blockData, ok := message["block_data"].([]interface{}); ok { blockDataBytes, err := json.Marshal(blockData) if err != nil { - logrus.Errorf("Error marshalling block data: %v", err) + logrus.Debugf("Error marshalling block data: %v", err) } else { _ = WriteData(node, "blocks", blockDataBytes) } @@ -228,7 +228,7 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { var ipfsData map[string]interface{} err = json.Unmarshal(ipfs, &ipfsData) if err != nil { - logrus.Errorf("Error unmarshalling IPFS data: %v", err) + logrus.Debugf("Error unmarshalling IPFS data: %v", err) } else { if message, ok := ipfsData["message"].(string); ok { _ = WriteData(node, "ipfs", []byte(message)) From b8cb6dc0a13b52b627e031029d81dfc21940f008 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 16:49:40 -0400 Subject: [PATCH 16/36] block work --- pkg/workers/workers.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 06eb0c4e..3084bf25 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -199,10 +199,10 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { return } if exists == nil { - err := db.WriteData(node, workEvent.CID, workEvent.Payload) + _ = db.WriteData(node, workEvent.CID, workEvent.Payload) + err := node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) if err != nil { - logrus.Errorf("Failed to write data for CID %s: %v", workEvent.CID, err) - return + logrus.Errorf("Error publishing block: %v", err) } } From 10c8fccb5b8d6bffdf771e678d081ddf479d7fa8 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 17:00:49 -0400 Subject: [PATCH 17/36] updated blocks sync --- pkg/db/resolver_cache.go | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/pkg/db/resolver_cache.go b/pkg/db/resolver_cache.go index e1a63900..db5a2d34 100644 --- a/pkg/db/resolver_cache.go +++ b/pkg/db/resolver_cache.go @@ -204,37 +204,27 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { // sync blocks blocks, _ := node.DHT.GetValue(ctx, "/db/blocks") var blockData map[string]interface{} - err := json.Unmarshal(blocks, &blockData) + err = json.Unmarshal(blocks, &blockData) if err != nil { logrus.Debugf("Error unmarshalling block data: %v", err) } else { - if message, ok := blockData["message"].(map[string]interface{}); ok { - if blockData, ok := message["block_data"].([]interface{}); ok { - blockDataBytes, err := json.Marshal(blockData) - if err != nil { - logrus.Debugf("Error marshalling block data: %v", err) - } else { - _ = WriteData(node, "blocks", blockDataBytes) - } + if blockData, ok := blockData["block_data"].([]interface{}); ok { + blockDataBytes, err := json.Marshal(blockData) + if err != nil { + logrus.Debugf("Error marshalling block data: %v", err) } else { - logrus.Errorf("Block data is not in the expected format") + _ = WriteData(node, "blocks", blockDataBytes) } } else { - logrus.Errorf("Block data does not contain a valid message") + logrus.Errorf("Block data is not in the expected format") } } // sync ipfs - ipfs, _ := node.DHT.GetValue(ctx, "/db/ipfs") - var ipfsData map[string]interface{} - err = json.Unmarshal(ipfs, &ipfsData) - if err != nil { + ipfs, e := node.DHT.GetValue(ctx, "/db/ipfs") + if e != nil { logrus.Debugf("Error unmarshalling IPFS data: %v", err) } else { - if message, ok := ipfsData["message"].(string); ok { - _ = WriteData(node, "ipfs", []byte(message)) - } else { - logrus.Errorf("IPFS data does not contain a valid message") - } + _ = WriteData(node, "ipfs", ipfs) } } } From edcacc23fb0155e33c006d379e5980b372c12518 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 17:06:32 -0400 Subject: [PATCH 18/36] block format fix on sync --- pkg/db/resolver_cache.go | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/pkg/db/resolver_cache.go b/pkg/db/resolver_cache.go index db5a2d34..94205837 100644 --- a/pkg/db/resolver_cache.go +++ b/pkg/db/resolver_cache.go @@ -202,23 +202,34 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { _ = WriteData(node, key, record.Value) // sync blocks - blocks, _ := node.DHT.GetValue(ctx, "/db/blocks") - var blockData map[string]interface{} - err = json.Unmarshal(blocks, &blockData) + blocks, err := node.DHT.GetValue(ctx, "/db/blocks") if err != nil { + logrus.Debugf("Error getting block data: %v", err) + continue + } + + var blockData map[string]interface{} + if err := json.Unmarshal(blocks, &blockData); err != nil { logrus.Debugf("Error unmarshalling block data: %v", err) - } else { - if blockData, ok := blockData["block_data"].([]interface{}); ok { - blockDataBytes, err := json.Marshal(blockData) - if err != nil { - logrus.Debugf("Error marshalling block data: %v", err) - } else { - _ = WriteData(node, "blocks", blockDataBytes) - } - } else { - logrus.Errorf("Block data is not in the expected format") - } + continue } + + blockDataList, ok := blockData["block_data"].([]interface{}) + if !ok { + logrus.Errorf("Block data is not in the expected format") + continue + } + + blockDataBytes, err := json.Marshal(blockDataList) + if err != nil { + logrus.Debugf("Error marshalling block data: %v", err) + continue + } + + if err := WriteData(node, "blocks", blockDataBytes); err != nil { + logrus.Debugf("Error writing block data: %v", err) + } + // sync ipfs ipfs, e := node.DHT.GetValue(ctx, "/db/ipfs") if e != nil { From 0ee4d74cef1f8728f90a322cb4f2f96128285870 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Thu, 11 Jul 2024 17:12:46 -0400 Subject: [PATCH 19/36] sync --- pkg/db/resolver_cache.go | 54 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/pkg/db/resolver_cache.go b/pkg/db/resolver_cache.go index 94205837..8c55e57d 100644 --- a/pkg/db/resolver_cache.go +++ b/pkg/db/resolver_cache.go @@ -202,33 +202,33 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { _ = WriteData(node, key, record.Value) // sync blocks - blocks, err := node.DHT.GetValue(ctx, "/db/blocks") - if err != nil { - logrus.Debugf("Error getting block data: %v", err) - continue - } - - var blockData map[string]interface{} - if err := json.Unmarshal(blocks, &blockData); err != nil { - logrus.Debugf("Error unmarshalling block data: %v", err) - continue - } - - blockDataList, ok := blockData["block_data"].([]interface{}) - if !ok { - logrus.Errorf("Block data is not in the expected format") - continue - } - - blockDataBytes, err := json.Marshal(blockDataList) - if err != nil { - logrus.Debugf("Error marshalling block data: %v", err) - continue - } - - if err := WriteData(node, "blocks", blockDataBytes); err != nil { - logrus.Debugf("Error writing block data: %v", err) - } + //blocks, err := node.DHT.GetValue(ctx, "/db/blocks") + //if err != nil { + // logrus.Debugf("Error getting block data: %v", err) + // continue + //} + // + //var blockData map[string]interface{} + //if err := json.Unmarshal(blocks, &blockData); err != nil { + // logrus.Debugf("Error unmarshalling block data: %v", err) + // continue + //} + // + //blockDataList, ok := blockData["block_data"].([]interface{}) + //if !ok { + // logrus.Errorf("Block data is not in the expected format") + // continue + //} + // + //blockDataBytes, err := json.Marshal(blockDataList) + //if err != nil { + // logrus.Debugf("Error marshalling block data: %v", err) + // continue + //} + // + //if err := WriteData(node, "blocks", blockDataBytes); err != nil { + // logrus.Debugf("Error writing block data: %v", err) + //} // sync ipfs ipfs, e := node.DHT.GetValue(ctx, "/db/ipfs") From 01a4c2c07fd5e0ba7ab030dff0b87bd7d8ccdb04 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Fri, 12 Jul 2024 12:36:40 -0400 Subject: [PATCH 20/36] rm e2e to tests --- .github/workflows/{e2e.yaml => tests.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{e2e.yaml => tests.yaml} (100%) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/tests.yaml similarity index 100% rename from .github/workflows/e2e.yaml rename to .github/workflows/tests.yaml From e75d258e09b46f941266fd074e50f1867b8c9721 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Fri, 12 Jul 2024 12:38:48 -0400 Subject: [PATCH 21/36] removed wip code out --- .gitignore | 3 ++- pkg/api/handlers_node.go | 27 --------------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 1c98a6eb..0ad23c15 100644 --- a/.gitignore +++ b/.gitignore @@ -66,4 +66,5 @@ cmd/masa-node-cli/log.txt output.mp3 docs/api-reference.md ./masa-node -transcription.txt \ No newline at end of file +transcription.txt +notes.txt \ No newline at end of file diff --git a/pkg/api/handlers_node.go b/pkg/api/handlers_node.go index d537c916..1d4ae801 100644 --- a/pkg/api/handlers_node.go +++ b/pkg/api/handlers_node.go @@ -455,30 +455,3 @@ func (api *API) GetNodeApiKey() gin.HandlerFunc { }) } } - -// wip -// peerInfos := node.DHT.RoutingTable().GetPeerInfos() -// if len(peerInfos) > 0 { -// for i, peerInfo := range peerInfos { -// fmt.Printf("Peer %d:\n", i+1) -// fmt.Printf(" PeerID: %s\n", peerInfo.Id) -// fmt.Printf(" Last Success: %v\n", peerInfo.LastSuccessfulOutboundQueryAt) -// fmt.Printf(" Added At: %v\n", peerInfo.AddedAt) -// fmt.Println("---") -// } -// } else { -// fmt.Println("No peers in the routing table") -// } - -// var routingDiscovery *routing.RoutingDiscovery -// protocolString := string(node.Protocol) -// logrus.Infof("Discovering peers for protocol: %s", protocolString) - -// routingDiscovery = routing.NewRoutingDiscovery(node.DHT) - -// peerChan, _ := routingDiscovery.FindPeers(ctx, protocolString) -// p := <-peerChan -// fmt.Println("peerChan", p.ID.String()) - -// v, _ := node.DHT.GetValue(ctx, "/db/"+p.ID.String()) -// fmt.Println("value", string(v)) From 88fc2e177439a6ee6b8935afce17ee8dbe045fb9 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Fri, 12 Jul 2024 13:16:54 -0400 Subject: [PATCH 22/36] handled some errors for specific context and syncing blocks across network --- pkg/db/operations.go | 3 ++- pkg/db/resolver_cache.go | 36 +++++++++--------------------------- pkg/workers/workers.go | 7 ++----- 3 files changed, 13 insertions(+), 33 deletions(-) diff --git a/pkg/db/operations.go b/pkg/db/operations.go index 53fedd44..b9d0d19b 100644 --- a/pkg/db/operations.go +++ b/pkg/db/operations.go @@ -95,7 +95,8 @@ func ReadData(node *masa.OracleNode, key string) ([]byte, error) { if err != nil { logrus.WithFields(logrus.Fields{ "error": err, - }).Error("Failed to read from the database") + }).Debug("Failed to read from the database") + // we don't need to present this to the user since it's OK to not find a record during other flows and that generates an err as well return nil, err } diff --git a/pkg/db/resolver_cache.go b/pkg/db/resolver_cache.go index 8c55e57d..fc962531 100644 --- a/pkg/db/resolver_cache.go +++ b/pkg/db/resolver_cache.go @@ -202,33 +202,15 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { _ = WriteData(node, key, record.Value) // sync blocks - //blocks, err := node.DHT.GetValue(ctx, "/db/blocks") - //if err != nil { - // logrus.Debugf("Error getting block data: %v", err) - // continue - //} - // - //var blockData map[string]interface{} - //if err := json.Unmarshal(blocks, &blockData); err != nil { - // logrus.Debugf("Error unmarshalling block data: %v", err) - // continue - //} - // - //blockDataList, ok := blockData["block_data"].([]interface{}) - //if !ok { - // logrus.Errorf("Block data is not in the expected format") - // continue - //} - // - //blockDataBytes, err := json.Marshal(blockDataList) - //if err != nil { - // logrus.Debugf("Error marshalling block data: %v", err) - // continue - //} - // - //if err := WriteData(node, "blocks", blockDataBytes); err != nil { - // logrus.Debugf("Error writing block data: %v", err) - //} + blocks, err := node.DHT.GetValue(ctx, "/db/blocks") + if err != nil { + logrus.Debugf("Error getting block data: %v", err) + continue + } + + if err := WriteData(node, "blocks", blocks); err != nil { + logrus.Debugf("Error writing block data: %v", err) + } // sync ipfs ipfs, e := node.DHT.GetValue(ctx, "/db/ipfs") diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 3084bf25..788f987f 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -193,11 +193,8 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { return } - exists, err := db.ReadData(node, workEvent.CID) - if err != nil { - logrus.Errorf("Failed to read data for CID %s: %v", workEvent.CID, err) - return - } + exists, _ := db.ReadData(node, workEvent.CID) + // we don't need to check for err since exists gives an err also - we only need to know if the record exists or not in this context if exists == nil { _ = db.WriteData(node, workEvent.CID, workEvent.Payload) err := node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) From 6c33b1cfb5116b350099181f5e7a340b507ffc38 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Fri, 12 Jul 2024 15:33:49 -0400 Subject: [PATCH 23/36] added blocktopic to work event payload --- pkg/db/operations.go | 5 +++++ pkg/workers/workers.go | 1 + 2 files changed, 6 insertions(+) diff --git a/pkg/db/operations.go b/pkg/db/operations.go index b9d0d19b..7a9c874c 100644 --- a/pkg/db/operations.go +++ b/pkg/db/operations.go @@ -103,6 +103,11 @@ func ReadData(node *masa.OracleNode, key string) ([]byte, error) { return val, nil } +// SendToS3 sends a payload to an S3-compatible API. +// +// @param {string} uid - The unique identifier for the payload. +// @param {map[string]string} payload - The payload to be sent, represented as a map of key-value pairs. +// @returns {error} - Returns an error if the operation fails, otherwise returns nil. func SendToS3(uid string, payload map[string]string) error { apiURL := os.Getenv("API_URL") diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 788f987f..a3c168b6 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -525,6 +525,7 @@ func processWork(data *pubsub2.Message, work string, startTime *time.Time, node Duration: duration.Seconds(), Timestamp: time.Now().Unix(), } + _ = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) updateRecords(node, workEvent) } From af3197b706e822c568b363cfc2ffbfce911fd9c7 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Fri, 12 Jul 2024 15:52:02 -0400 Subject: [PATCH 24/36] checking if is worker for work logging --- pkg/api/handlers_node.go | 2 +- pkg/workers/workers.go | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/api/handlers_node.go b/pkg/api/handlers_node.go index 1d4ae801..b36a33a5 100644 --- a/pkg/api/handlers_node.go +++ b/pkg/api/handlers_node.go @@ -273,7 +273,7 @@ func (api *API) GetFromDHT() gin.HandlerFunc { }).Error("Failed to read data from DHT") c.JSON(http.StatusInternalServerError, gin.H{ "success": false, - "message": "failed to read data", + "message": "no data", }) return } diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index a3c168b6..847b0d33 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -111,11 +111,17 @@ func (a *Worker) Receive(ctx actor.Context) { case *messages.Connect: a.HandleConnect(ctx, m) case *actor.Started: - a.HandleLog(ctx, "[+] Actor started") + if a.Node.IsWorker() { + a.HandleLog(ctx, "[+] Actor started") + } case *actor.Stopping: - a.HandleLog(ctx, "[+] Actor stopping") + if a.Node.IsWorker() { + a.HandleLog(ctx, "[+] Actor stopping") + } case *actor.Stopped: - a.HandleLog(ctx, "[+] Actor stopped") + if a.Node.IsWorker() { + a.HandleLog(ctx, "[+] Actor stopped") + } case *messages.Work: if a.Node.IsWorker() { a.HandleWork(ctx, m, a.Node) @@ -315,8 +321,8 @@ func SendWork(node *masa.OracleNode, m *pubsub2.Message) { for _, p := range peers { for _, addr := range p.Multiaddrs { ipAddr, _ := addr.ValueForProtocol(multiaddr.P_IP4) - logrus.Infof("[+] Worker Address: %s", ipAddr) if !isBootnode(ipAddr) && (p.IsTwitterScraper || p.IsWebScraper || p.IsDiscordScraper) { + logrus.Infof("[+] Worker Address: %s", ipAddr) wg.Add(1) go func(p pubsub.NodeData) { defer wg.Done() From 5f5f28ec8076d54d6240f7686eb941541a9a1f30 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Fri, 12 Jul 2024 15:55:44 -0400 Subject: [PATCH 25/36] changed syncing log text --- pkg/db/resolver_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/db/resolver_cache.go b/pkg/db/resolver_cache.go index fc962531..3042f247 100644 --- a/pkg/db/resolver_cache.go +++ b/pkg/db/resolver_cache.go @@ -198,7 +198,7 @@ func iterateAndPublish(ctx context.Context, node *masa.OracleNode) { if len(key) > 0 && key[0] == '/' { key = key[1:] } - logrus.Printf("syncing record %s", key) + logrus.Printf("syncing %s", key) _ = WriteData(node, key, record.Value) // sync blocks From 792eb213034c469f7e13cc53ebf81075599e4de9 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Sun, 14 Jul 2024 11:01:30 -0400 Subject: [PATCH 26/36] hoisting --- cmd/masa-node/main.go | 4 +--- pkg/workers/workers.go | 10 +++++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cmd/masa-node/main.go b/cmd/masa-node/main.go index 49777f98..fd0e19aa 100644 --- a/cmd/masa-node/main.go +++ b/cmd/masa-node/main.go @@ -96,6 +96,7 @@ func main() { if node.IsStaked { go workers.SubscribeToWorkers(node) go workers.MonitorWorkers(ctx, node) + go masa.SubscribeToBlocks(ctx, node) } // Listen for SIGINT (CTRL+C) @@ -126,8 +127,5 @@ func main() { // Display the welcome message with the multiaddress and IP address config.DisplayWelcomeMessage(multiAddr, ipAddr, keyManager.EthAddress, isStaked, isValidator, cfg.TwitterScraper, cfg.DiscordScraper, cfg.WebScraper, config.Version) - // Subscribe to blocks - masa.SubscribeToBlocks(ctx, node) - <-ctx.Done() } diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 847b0d33..9a7eb3f5 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -237,9 +237,13 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { Duration: workEvent.Duration, Timestamp: time.Now().Unix(), } - nodeData.Records = append(nodeData.Records.([]CID), newCID) - err = node.NodeTracker.AddOrUpdateNodeData(&nodeData, true) - if err != nil { + if records, ok := nodeData.Records.([]CID); ok { + nodeData.Records = append(records, newCID) + } else { + logrus.Errorf("Failed to assert type of nodeData.Records") + return + } + if err := node.NodeTracker.AddOrUpdateNodeData(&nodeData, true); err != nil { logrus.Errorf("Failed to update node data: %v", err) return } From 7d527c9cc638f203f4253ed641125fc055eb0948 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 16 Jul 2024 09:07:35 -0400 Subject: [PATCH 27/36] inline documenting --- pkg/workers/workers.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 9a7eb3f5..3f21c4e7 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -504,6 +504,14 @@ func MonitorWorkers(ctx context.Context, node *masa.OracleNode) { } } +/** + * Processes the validator data received from the network. + * + * @param {pubsub2.Message} data - The message data received from the network. + * @param {map[string]interface{}} validatorDataMap - The map containing validator data. + * @param {time.Time} startTime - The start time of the work. + * @param {masa.OracleNode} node - The OracleNode instance. + */ func processValidatorData(data *pubsub2.Message, validatorDataMap map[string]interface{}, startTime *time.Time, node *masa.OracleNode) { if response, ok := validatorDataMap["Response"].(map[string]interface{}); ok { if _, ok := response["error"].(string); ok { @@ -521,6 +529,14 @@ func processValidatorData(data *pubsub2.Message, validatorDataMap map[string]int } } +/** + * Processes the work received from the network. + * + * @param {pubsub2.Message} data - The message data received from the network. + * @param {string} work - The work data as a string. + * @param {time.Time} startTime - The start time of the work. + * @param {masa.OracleNode} node - The OracleNode instance. + */ func processWork(data *pubsub2.Message, work string, startTime *time.Time, node *masa.OracleNode) { key, _ := computeCid(work) logrus.Infof("[+] Work done %s", key) From b9dd7bf3e22c7385b3da4f127d5214524c9f02d3 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 16 Jul 2024 13:41:44 -0400 Subject: [PATCH 28/36] hiding write error console log for non validators --- .env.example | 26 ++++++++++++++------------ pkg/workers/workers.go | 4 +++- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.env.example b/.env.example index 40874204..31be74e7 100644 --- a/.env.example +++ b/.env.example @@ -3,30 +3,32 @@ # Node Configuration BOOTNODES= -API_KEY= +# API_KEY= + ENV= FILE_PATH=. PORT=8080 RPC_URL=https://ethereum-sepolia.publicnode.com -VALIDATOR=false + +# VALIDATOR=true # AI LLM -CLAUDE_API_KEY= -CLAUDE_API_URL= -CLAUDE_API_VERSION= -ELAB_KEY= +# CLAUDE_API_KEY= +# CLAUDE_API_URL= +# CLAUDE_API_VERSION= +# ELAB_KEY= # For use with ollama https://hub.docker.com/r/ollama/ollama -LLM_SERVER=false -LLM_CHAT_URL=http://localhost:11434/api/chat +# LLM_SERVER=false +# LLM_CHAT_URL=http://localhost:11434/api/chat # For use with bring your own Cloudflare worker token -LLM_CF_URL= -LLM_CF_TOKEN= +# LLM_CF_URL= +# LLM_CF_TOKEN= # For use with bring your own OpenAI api key -OPENAI_API_KEY= -PROMPT="You are a helpful assistant." +# OPENAI_API_KEY= +# PROMPT="You are a helpful assistant." # For use with bring your own Twitter credentials # TWITTER_USER= diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 3f21c4e7..09c9c974 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -256,7 +256,9 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { } err = db.WriteData(node, workEvent.PeerId, jsonData) if err != nil { - logrus.Errorf("Failed to write node data for peer ID %s: %v", workEvent.PeerId, err) + if node.IsValidator { + logrus.Errorf("Failed to write node data for peer ID %s: %v", workEvent.PeerId, err) + } return } logrus.Infof("[+] Updated records key %s for node %s", workEvent.CID, workEvent.PeerId) From 18b17f1eeffcfdf9603b0f0864b73390bb5527c0 Mon Sep 17 00:00:00 2001 From: Brendan Playford <34052452+teslashibe@users.noreply.github.com> Date: Thu, 11 Jul 2024 18:44:47 +0100 Subject: [PATCH 29/36] Update workers.go to handle nil pointers --- pkg/workers/workers.go | 60 ++++++++---------------------------------- 1 file changed, 11 insertions(+), 49 deletions(-) diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 09c9c974..d3d2c85f 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -202,8 +202,12 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { exists, _ := db.ReadData(node, workEvent.CID) // we don't need to check for err since exists gives an err also - we only need to know if the record exists or not in this context if exists == nil { - _ = db.WriteData(node, workEvent.CID, workEvent.Payload) - err := node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) + err := db.WriteData(node, workEvent.CID, workEvent.Payload) + if err != nil { + logrus.Errorf("Failed to write data: %v", err) + return + } + err = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) if err != nil { logrus.Errorf("Error publishing block: %v", err) } @@ -261,6 +265,11 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { } return } + err = db.WriteData(node, workEvent.PeerId, jsonData) + if err != nil { + logrus.Error(err) + return + } logrus.Infof("[+] Updated records key %s for node %s", workEvent.CID, workEvent.PeerId) } @@ -452,54 +461,7 @@ func MonitorWorkers(ctx context.Context, node *masa.OracleNode) { logrus.Debugf("Error processing data.ValidatorData: %v", data.ValidatorData) } -<<<<<<< HEAD processValidatorData(data, validatorDataMap, &startTime, node) -======= - if validatorDataMap, ok := data.ValidatorData.(map[string]interface{}); ok { - if response, ok := validatorDataMap["Response"].(map[string]interface{}); ok { - if _, ok := response["error"].(string); ok { - logrus.Infof("[+] Work failed %s", response["error"]) - } else if work, ok := response["data"].(string); ok { - key, _ := computeCid(work) - logrus.Infof("[+] Work completed -> %s", key) - - endTime := time.Now() - duration := endTime.Sub(startTime) - - workEvent := db.WorkEvent{ - CID: key, - PeerId: data.ID, - Payload: []byte(work), - Duration: duration.Seconds(), - Timestamp: time.Now().Unix(), - } - - updateRecords(node, workEvent) - } else if w, ok := response["data"].(map[string]interface{}); ok { - work, err := json.Marshal(w) - if err != nil { - logrus.Errorf("Error marshalling data.ValidatorData: %v", err) - continue - } - key, _ := computeCid(string(work)) - logrus.Infof("[+] Work done %s", key) - - endTime := time.Now() - duration := endTime.Sub(startTime) - - workEvent := db.WorkEvent{ - CID: key, - PeerId: data.ID, - Payload: work, - Duration: duration.Seconds(), - Timestamp: time.Now().Unix(), - } - - updateRecords(node, workEvent) - } - } - } ->>>>>>> 22b5207 (bugfix #46) case <-ctx.Done(): return } From 4d849d850da130070621c692ecd797d7273a155b Mon Sep 17 00:00:00 2001 From: Brendan Playford <34052452+teslashibe@users.noreply.github.com> Date: Thu, 11 Jul 2024 19:04:20 +0100 Subject: [PATCH 30/36] handle errors from db and update breaking changes --- pkg/api/handlers_node.go | 2 +- pkg/db/operations.go | 3 +-- pkg/workers/workers.go | 14 ++++++-------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/pkg/api/handlers_node.go b/pkg/api/handlers_node.go index b36a33a5..1d4ae801 100644 --- a/pkg/api/handlers_node.go +++ b/pkg/api/handlers_node.go @@ -273,7 +273,7 @@ func (api *API) GetFromDHT() gin.HandlerFunc { }).Error("Failed to read data from DHT") c.JSON(http.StatusInternalServerError, gin.H{ "success": false, - "message": "no data", + "message": "failed to read data", }) return } diff --git a/pkg/db/operations.go b/pkg/db/operations.go index 7a9c874c..0d5f7aa0 100644 --- a/pkg/db/operations.go +++ b/pkg/db/operations.go @@ -95,8 +95,7 @@ func ReadData(node *masa.OracleNode, key string) ([]byte, error) { if err != nil { logrus.WithFields(logrus.Fields{ "error": err, - }).Debug("Failed to read from the database") - // we don't need to present this to the user since it's OK to not find a record during other flows and that generates an err as well + }).Error("Failed to read from the database") return nil, err } diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index d3d2c85f..58cf5240 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -199,12 +199,15 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { return } - exists, _ := db.ReadData(node, workEvent.CID) - // we don't need to check for err since exists gives an err also - we only need to know if the record exists or not in this context + exists, err := db.ReadData(node, workEvent.CID) + if err != nil { + logrus.Errorf("Failed to read data for CID %s: %v", workEvent.CID, err) + return + } if exists == nil { err := db.WriteData(node, workEvent.CID, workEvent.Payload) if err != nil { - logrus.Errorf("Failed to write data: %v", err) + logrus.Errorf("Failed to write data for CID %s: %v", workEvent.CID, err) return } err = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) @@ -265,11 +268,6 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { } return } - err = db.WriteData(node, workEvent.PeerId, jsonData) - if err != nil { - logrus.Error(err) - return - } logrus.Infof("[+] Updated records key %s for node %s", workEvent.CID, workEvent.PeerId) } From 99a95f986f94448543b72289e9ef7d0f259f8e79 Mon Sep 17 00:00:00 2001 From: Brendan Playford <34052452+teslashibe@users.noreply.github.com> Date: Thu, 11 Jul 2024 23:31:52 +0100 Subject: [PATCH 31/36] Update monitorworkers and refactor code --- pkg/workers/workers.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 58cf5240..dd88d954 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -513,7 +513,9 @@ func processWork(data *pubsub2.Message, work string, startTime *time.Time, node Duration: duration.Seconds(), Timestamp: time.Now().Unix(), } - _ = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) + + // @todo handle mutliple block publishes issue + // _ = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) updateRecords(node, workEvent) } From 962b55dc551da1102a085cd759e062909d18f5fb Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 16 Jul 2024 14:39:34 -0400 Subject: [PATCH 32/36] disabled BlockTopic --- pkg/oracle_node.go | 2 +- pkg/workers/workers.go | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/pkg/oracle_node.go b/pkg/oracle_node.go index 50d98512..d8f6c302 100644 --- a/pkg/oracle_node.go +++ b/pkg/oracle_node.go @@ -373,7 +373,7 @@ type BlockData struct { } type Blocks struct { - TransactionHash string `json:"transaction_hash"` + TransactionHash string `json:"last_transaction_hash"` BlockData []BlockData `json:"block_data"` } diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index dd88d954..366810e6 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -199,11 +199,8 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { return } - exists, err := db.ReadData(node, workEvent.CID) - if err != nil { - logrus.Errorf("Failed to read data for CID %s: %v", workEvent.CID, err) - return - } + exists, _ := db.ReadData(node, workEvent.CID) + // we don't need to check for err since !exists gives an err also - we only need to know if the record exists or not in this context if exists == nil { err := db.WriteData(node, workEvent.CID, workEvent.Payload) if err != nil { @@ -513,7 +510,6 @@ func processWork(data *pubsub2.Message, work string, startTime *time.Time, node Duration: duration.Seconds(), Timestamp: time.Now().Unix(), } - // @todo handle mutliple block publishes issue // _ = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) From eb3adb29bbae75a28ecff47de11cf34d33f650b9 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 16 Jul 2024 15:28:32 -0400 Subject: [PATCH 33/36] env.example --- .env.example | 74 +++++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/.env.example b/.env.example index 31be74e7..ed88b89d 100644 --- a/.env.example +++ b/.env.example @@ -1,42 +1,50 @@ -# This env is a helper for when testing the masa oracle node locally +## note: all nodes need to be staked to participate -# Node Configuration -BOOTNODES= +## PEER configuration +BOOTNODES= the bootnode address +ENV=test +FILE_PATH=. +PORT=8080 +RPC_URL=https://ethereum-sepolia.publicnode.com -# API_KEY= +## VALIDATOR configuration +BOOTNODES= the bootnode address +ENV=test +FILE_PATH=. +PORT=8080 +RPC_URL=https://ethereum-sepolia.publicnode.com +VALIDATOR=true -ENV= +## ORACLE peer configuration +BOOTNODES= the bootnode address +ENV=test FILE_PATH=. PORT=8080 RPC_URL=https://ethereum-sepolia.publicnode.com +VALIDATOR=false +TWITTER_USER= your twitter username +TWITTER_PASS= your twitter password +TWITTER_2FA_CODE= your twitter 2fa code +DISCORD_SCRAPER=true +DISCORD_BOT_TOKEN= your discord bot token +TWITTER_SCRAPER=false +WEB_SCRAPER=false + + +# For use with ollama https://hub.docker.com/r/ollama/ollama if running on same server +CLAUDE_API_KEY= +CLAUDE_API_URL= +CLAUDE_API_VERSION= +ELAB_KEY= -# VALIDATOR=true +# For use with ollama https://hub.docker.com/r/ollama/ollama +LLM_SERVER=true +LLM_CHAT_URL=http://localhost:11434/api/chat -# AI LLM -# CLAUDE_API_KEY= -# CLAUDE_API_URL= -# CLAUDE_API_VERSION= -# ELAB_KEY= +# Bring your own Cloudflare worker token +LLM_CF_URL= +LLM_CF_TOKEN= -# For use with ollama https://hub.docker.com/r/ollama/ollama -# LLM_SERVER=false -# LLM_CHAT_URL=http://localhost:11434/api/chat - -# For use with bring your own Cloudflare worker token -# LLM_CF_URL= -# LLM_CF_TOKEN= - -# For use with bring your own OpenAI api key -# OPENAI_API_KEY= -# PROMPT="You are a helpful assistant." - -# For use with bring your own Twitter credentials -# TWITTER_USER= -# TWITTER_PASS= -# TWITTER_2FA_CODE= - -# Worker participation -# DISCORD_SCRAPER=true -# DISCORD_BOT_TOKEN= -# TWITTER_SCRAPER=false -# WEB_SCRAPER=false +# Bring your own OpenAI api key +OPENAI_API_KEY= +PROMPT="You are a helpful assistant." From 8899e3c817740703e7855f59b23d0fde47cbe544 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 16 Jul 2024 15:49:15 -0400 Subject: [PATCH 34/36] env example update --- .env.example | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index ed88b89d..6e557c90 100644 --- a/.env.example +++ b/.env.example @@ -1,14 +1,14 @@ ## note: all nodes need to be staked to participate ## PEER configuration -BOOTNODES= the bootnode address +BOOTNODES=/ip4/35.223.224.220/udp/4001/quic-v1/p2p/16Uiu2HAmPxXXjR1XJEwckh6q1UStheMmGaGe8fyXdeRs3SejadSa ENV=test FILE_PATH=. PORT=8080 RPC_URL=https://ethereum-sepolia.publicnode.com ## VALIDATOR configuration -BOOTNODES= the bootnode address +BOOTNODES=/ip4/35.223.224.220/udp/4001/quic-v1/p2p/16Uiu2HAmPxXXjR1XJEwckh6q1UStheMmGaGe8fyXdeRs3SejadSa ENV=test FILE_PATH=. PORT=8080 @@ -16,12 +16,11 @@ RPC_URL=https://ethereum-sepolia.publicnode.com VALIDATOR=true ## ORACLE peer configuration -BOOTNODES= the bootnode address +BOOTNODES=/ip4/35.223.224.220/udp/4001/quic-v1/p2p/16Uiu2HAmPxXXjR1XJEwckh6q1UStheMmGaGe8fyXdeRs3SejadSa ENV=test FILE_PATH=. PORT=8080 RPC_URL=https://ethereum-sepolia.publicnode.com -VALIDATOR=false TWITTER_USER= your twitter username TWITTER_PASS= your twitter password TWITTER_2FA_CODE= your twitter 2fa code From 9650324e1a8eec25204476c4d0362e3343f74dd7 Mon Sep 17 00:00:00 2001 From: jdutchak Date: Tue, 16 Jul 2024 15:52:46 -0400 Subject: [PATCH 35/36] env example update --- .env.example | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 6e557c90..05fab4f0 100644 --- a/.env.example +++ b/.env.example @@ -15,7 +15,7 @@ PORT=8080 RPC_URL=https://ethereum-sepolia.publicnode.com VALIDATOR=true -## ORACLE peer configuration +## ORACLE configuration BOOTNODES=/ip4/35.223.224.220/udp/4001/quic-v1/p2p/16Uiu2HAmPxXXjR1XJEwckh6q1UStheMmGaGe8fyXdeRs3SejadSa ENV=test FILE_PATH=. @@ -26,11 +26,12 @@ TWITTER_PASS= your twitter password TWITTER_2FA_CODE= your twitter 2fa code DISCORD_SCRAPER=true DISCORD_BOT_TOKEN= your discord bot token -TWITTER_SCRAPER=false -WEB_SCRAPER=false +TWITTER_SCRAPER=true +WEB_SCRAPER=true +## optional added features for ORACLE or VALIDATOR nodes only -# For use with ollama https://hub.docker.com/r/ollama/ollama if running on same server +# Claude API and Elevenlabs API CLAUDE_API_KEY= CLAUDE_API_URL= CLAUDE_API_VERSION= From 62588f8fb65b45a61bb4efe2032470b1f1f5fe1e Mon Sep 17 00:00:00 2001 From: mudler Date: Wed, 17 Jul 2024 18:16:31 +0200 Subject: [PATCH 36/36] Comment out racy code (but logically correct) Signed-off-by: mudler --- pkg/workers/workers.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/workers/workers.go b/pkg/workers/workers.go index 366810e6..2b5269e4 100644 --- a/pkg/workers/workers.go +++ b/pkg/workers/workers.go @@ -207,10 +207,10 @@ func updateRecords(node *masa.OracleNode, workEvent db.WorkEvent) { logrus.Errorf("Failed to write data for CID %s: %v", workEvent.CID, err) return } - err = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) - if err != nil { - logrus.Errorf("Error publishing block: %v", err) - } + //err = node.PubSubManager.Publish(config.TopicWithVersion(config.BlockTopic), workEvent.Payload) + //if err != nil { + // logrus.Errorf("Error publishing block: %v", err) + //} } var nodeData pubsub.NodeData