diff --git a/cmd/connector-common-lootboxes-timescale/main.go b/cmd/connector-common-lootboxes-timescale/main.go index b7f0d2e10..2ef4db027 100644 --- a/cmd/connector-common-lootboxes-timescale/main.go +++ b/cmd/connector-common-lootboxes-timescale/main.go @@ -2,9 +2,18 @@ package main import ( "github.com/fluidity-money/fluidity-app/lib/databases/timescale/lootboxes" + "github.com/fluidity-money/fluidity-app/lib/databases/timescale/user-actions" queue "github.com/fluidity-money/fluidity-app/lib/queues/lootboxes" ) func main() { - queue.LootboxesAll(lootboxes.InsertLootbox) + queue.LootboxesAll(func(lootbox lootboxes.Lootbox) { + user_actions.UpdateAggregatedUserTransactionByHashWithLootbottles( + lootbox.LootboxCount, + lootbox.RewardTier, + lootbox.TransactionHash, + ) + + lootboxes.InsertLootbox(lootbox) + }) } diff --git a/cmd/microservice-ethereum-create-transaction-lootboxes/main.go b/cmd/microservice-ethereum-create-transaction-lootboxes/main.go index a523578a7..4d03a67a9 100644 --- a/cmd/microservice-ethereum-create-transaction-lootboxes/main.go +++ b/cmd/microservice-ethereum-create-transaction-lootboxes/main.go @@ -309,6 +309,7 @@ func main() { RewardTier: rewardTier, LootboxCount: lootboxCountFloat, Application: application, + Epoch: currentEpoch, } queue.SendMessage(lootboxes_queue.TopicLootboxes, lootbox) diff --git a/database/102-up-timescale/20240110163905-user_actions_user_actions_lootbottles_make_table.sql b/database/102-up-timescale/20240110163905-user_actions_user_actions_lootbottles_make_table.sql new file mode 100644 index 000000000..241c9029c --- /dev/null +++ b/database/102-up-timescale/20240110163905-user_actions_user_actions_lootbottles_make_table.sql @@ -0,0 +1,67 @@ +-- migrate:up + +DROP FUNCTION aggregated_user_transactions_lootbottles; + +DROP TABLE aggregated_user_transactions_lootbottles_return; + +ALTER TABLE aggregated_user_transactions + ADD COLUMN lootbox_count DECIMAL, + ADD COLUMN reward_tier INTEGER; + +-- migrate:down + +ALTER TABLE aggregated_user_transactions + DROP COLUMN lootbox_count, + DROP COLUMN reward_tier; + +CREATE TABLE aggregated_user_transactions_lootbottles_return ( + token_short_name VARCHAR NOT NULL, + network network_blockchain NOT NULL, + time TIMESTAMP WITHOUT TIME ZONE NOT NULL, + transaction_hash VARCHAR NOT NULL, + sender_address VARCHAR NOT NULL, + recipient_address VARCHAR NOT NULL, + amount DOUBLE PRECISION NOT NULL, + application VARCHAR NOT NULL, + winning_amount DOUBLE PRECISION NOT NULL, + winning_address VARCHAR NOT NULL, + reward_hash VARCHAR NOT NULL, + type user_action NOT NULL, + swap_in BOOLEAN NOT NULL, + utility_amount DOUBLE PRECISION NOT NULL, + utility_name VARCHAR NOT NULL, + + lootbox_count DECIMAL, + reward_tier INTEGER +); + +CREATE FUNCTION aggregated_user_transactions_lootbottles() +RETURNS SETOF aggregated_user_transactions_lootbottles_return +LANGUAGE SQL +STABLE +AS +$$ +SELECT + token_short_name, + network, + time, + transaction_hash, + sender_address, + recipient_address, + amount, + application, + winning_amount, + winning_address, + reward_hash, + type user_action, + swap_in, + utility_amount, + utility_name, + lootbox_count, + reward_tier +FROM + aggregated_user_transactions +LEFT JOIN ( + SELECT reward_tier, lootbox_count FROM lootbox +) AS lootbox_user_actions ON transaction_hash = aggregated_user_transactions.transaction_hash +$$; diff --git a/database/102-up-timescale/20240111140041-lootbottles_reward_ambassadors_and_launch_epoch_2.sql b/database/102-up-timescale/20240111140041-lootbottles_reward_ambassadors_and_launch_epoch_2.sql new file mode 100644 index 000000000..8c13f97e4 --- /dev/null +++ b/database/102-up-timescale/20240111140041-lootbottles_reward_ambassadors_and_launch_epoch_2.sql @@ -0,0 +1,83 @@ + +-- migrate:up + +INSERT INTO lootbox ( + address, + source, + awarded_time, + volume, + reward_tier, + lootbox_count, + application, + epoch +) + +VALUES + ('0x75964ac8cc1676eb51451f25faaaefd40ccde602', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0x75964ac8cc1676eb51451f25faaaefd40ccde602', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0x75964ac8cc1676eb51451f25faaaefd40ccde602', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0x75964ac8cc1676eb51451f25faaaefd40ccde602', 'airdrop', timezone('utc', now()), 0, 4, 1, 'none', 'epoch_2'), + ('0xd1d13003128cb454ff562850f86413498c1ebedf', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0xd1d13003128cb454ff562850f86413498c1ebedf', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0xd1d13003128cb454ff562850f86413498c1ebedf', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0x8cb42fe548bb51ca4125eac3c14cf177b2b183d8', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0x8cb42fe548bb51ca4125eac3c14cf177b2b183d8', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0x8cb42fe548bb51ca4125eac3c14cf177b2b183d8', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0xb363335ff6e0a91f870c200bf6fcb38d1fd0f346', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0xb363335ff6e0a91f870c200bf6fcb38d1fd0f346', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0xb363335ff6e0a91f870c200bf6fcb38d1fd0f346', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0x2d0eb64ffc36339a15c531b64fd55404ca7f8f62', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0x2d0eb64ffc36339a15c531b64fd55404ca7f8f62', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0x2d0eb64ffc36339a15c531b64fd55404ca7f8f62', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0x32f5de0d8f24094c660979ae34772985a1a8c831', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0x32f5de0d8f24094c660979ae34772985a1a8c831', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0x32f5de0d8f24094c660979ae34772985a1a8c831', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0x2da7958dc2a33e7720935102107f0886e8ab6574', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0x2da7958dc2a33e7720935102107f0886e8ab6574', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0x2da7958dc2a33e7720935102107f0886e8ab6574', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0xf6352e3a8e502b93af36821cc6f45d6f37ac4aed', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0xf6352e3a8e502b93af36821cc6f45d6f37ac4aed', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0xf6352e3a8e502b93af36821cc6f45d6f37ac4aed', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0xef05ee60799ea122db2ace21425f6d4991dd3805', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0xef05ee60799ea122db2ace21425f6d4991dd3805', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0xef05ee60799ea122db2ace21425f6d4991dd3805', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0x0b0154cbfaba8a18caf5fcba2b83ce383c1a0095', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0x0b0154cbfaba8a18caf5fcba2b83ce383c1a0095', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0x0b0154cbfaba8a18caf5fcba2b83ce383c1a0095', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'), + ('0x225e02bd307a5af7608ceff02a4e48ba06be4ddd', 'airdrop', timezone('utc', now()), 0, 1, 100, 'none', 'epoch_2'), + ('0x225e02bd307a5af7608ceff02a4e48ba06be4ddd', 'airdrop', timezone('utc', now()), 0, 2, 50, 'none', 'epoch_2'), + ('0x225e02bd307a5af7608ceff02a4e48ba06be4ddd', 'airdrop', timezone('utc', now()), 0, 3, 10, 'none', 'epoch_2'); + +INSERT INTO lootbox_config ( + is_current_program, + program_begin, + program_end, + epoch_identifier, + ethereum_application +) + +VALUES ( + FALSE, + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP + INTERVAL '30 days', + 'epoch_2', + 'none' +); + +-- migrate:down + +DELETE FROM lootbox +WHERE + (address = '0x75964ac8cc1676eb51451f25faaaefd40ccde602' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0x75964ac8cc1676eb51451f25faaaefd40ccde602' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0x75964ac8cc1676eb51451f25faaaefd40ccde602' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') OR (address = '0x75964ac8cc1676eb51451f25faaaefd40ccde602' AND source = 'airdrop' AND reward_tier = 4 AND lootbox_count = 1 AND epoch = 'epoch_2') + OR (address = '0xd1d13003128cb454ff562850f86413498c1ebedf' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0xd1d13003128cb454ff562850f86413498c1ebedf' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0xd1d13003128cb454ff562850f86413498c1ebedf' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0x8cb42fe548bb51ca4125eac3c14cf177b2b183d8' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0x8cb42fe548bb51ca4125eac3c14cf177b2b183d8' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0x8cb42fe548bb51ca4125eac3c14cf177b2b183d8' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0xb363335ff6e0a91f870c200bf6fcb38d1fd0f346' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0xb363335ff6e0a91f870c200bf6fcb38d1fd0f346' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0xb363335ff6e0a91f870c200bf6fcb38d1fd0f346' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0x2d0eb64ffc36339a15c531b64fd55404ca7f8f62' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0x2d0eb64ffc36339a15c531b64fd55404ca7f8f62' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0x2d0eb64ffc36339a15c531b64fd55404ca7f8f62' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0x32f5de0d8f24094c660979ae34772985a1a8c831' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0x32f5de0d8f24094c660979ae34772985a1a8c831' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0x32f5de0d8f24094c660979ae34772985a1a8c831' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0x2da7958dc2a33e7720935102107f0886e8ab6574' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0x2da7958dc2a33e7720935102107f0886e8ab6574' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0x2da7958dc2a33e7720935102107f0886e8ab6574' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0xf6352e3a8e502b93af36821cc6f45d6f37ac4aed' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0xf6352e3a8e502b93af36821cc6f45d6f37ac4aed' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0xf6352e3a8e502b93af36821cc6f45d6f37ac4aed' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0xef05ee60799ea122db2ace21425f6d4991dd3805' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0xef05ee60799ea122db2ace21425f6d4991dd3805' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0xef05ee60799ea122db2ace21425f6d4991dd3805' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0x0b0154cbfaba8a18caf5fcba2b83ce383c1a0095' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0x0b0154cbfaba8a18caf5fcba2b83ce383c1a0095' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0x0b0154cbfaba8a18caf5fcba2b83ce383c1a0095' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + OR (address = '0x225e02bd307a5af7608ceff02a4e48ba06be4ddd' AND source = 'airdrop' AND reward_tier = 1 AND lootbox_count = 100 AND epoch = 'epoch_2') OR (address = '0x225e02bd307a5af7608ceff02a4e48ba06be4ddd' AND source = 'airdrop' AND reward_tier = 2 AND lootbox_count = 50 AND epoch = 'epoch_2') OR (address = '0x225e02bd307a5af7608ceff02a4e48ba06be4ddd' AND source = 'airdrop' AND reward_tier = 3 AND lootbox_count = 10 AND epoch = 'epoch_2') + +DELETE FROM lootbox_config WHERE epoch_identifier = 'epoch_2'; diff --git a/lib/databases/timescale/lootboxes/config.go b/lib/databases/timescale/lootboxes/config.go index 5f8e1f12e..ce39b1383 100644 --- a/lib/databases/timescale/lootboxes/config.go +++ b/lib/databases/timescale/lootboxes/config.go @@ -33,7 +33,7 @@ func GetLootboxConfig() (programFound bool, hasBegun bool, curEpoch string, curA program_begin < (select timestamp from t) AND program_end > (select timestamp from t), epoch_identifier, - current_application + ethereum_application FROM %s WHERE is_current_program;`, diff --git a/lib/databases/timescale/lootboxes/rewards.go b/lib/databases/timescale/lootboxes/rewards.go index a0df54a3b..d5887f843 100644 --- a/lib/databases/timescale/lootboxes/rewards.go +++ b/lib/databases/timescale/lootboxes/rewards.go @@ -301,11 +301,11 @@ func UpdateOrInsertAmountsRewarded(network_ network.BlockchainNetwork, lootboxCu $4, $5, $6, - $7 + CURRENT_TIMESTAMP ) - ON CONFLICT (id) + ON CONFLICT (network, epoch, token_short_name, winner, application) DO UPDATE SET - amount_earned = amount_earned + $4, + amount_earned = lootbox_amounts_rewarded.amount_earned + $4, last_updated = CURRENT_TIMESTAMP`, TableLootboxAmountsRewarded, @@ -317,8 +317,8 @@ func UpdateOrInsertAmountsRewarded(network_ network.BlockchainNetwork, lootboxCu lootboxCurrentEpoch, tokenShortName, amountNormalLossy, - application, winnerAddress, + application, ) if err != nil { diff --git a/lib/databases/timescale/user-actions/user-actions-aggregate.go b/lib/databases/timescale/user-actions/user-actions-aggregate.go index 1fa7f7538..ef5e752b8 100644 --- a/lib/databases/timescale/user-actions/user-actions-aggregate.go +++ b/lib/databases/timescale/user-actions/user-actions-aggregate.go @@ -14,9 +14,7 @@ import ( user_actions "github.com/fluidity-money/fluidity-app/lib/types/user-actions" ) -const ( - TableAggregatedUserTransactions = `aggregated_user_transactions` -) +const TableAggregatedUserTransactions = `aggregated_user_transactions` func InsertAggregatedUserTransaction(userTransaction user_actions.AggregatedUserTransaction) { timescaleClient := timescale.Client() @@ -218,3 +216,46 @@ func UpdateAggregatedUserTransactionByHash(userTransaction user_actions.Aggregat }) } } + +// UpdateAggregatedUserTransactionByHashWithLootbottles after finding it first +func UpdateAggregatedUserTransactionByHashWithLootbottles(lootbottlesCount float64, rewardTier int, transactionHash string) { + timescaleClient := timescale.Client() + + statementText := fmt.Sprintf( + `UPDATE %s + SET lootbox_count = $1, reward_tier = $2 + WHERE transaction_hash = $3`, + + TableAggregatedUserTransactions, + ) + + r, err := timescaleClient.Exec( + statementText, + lootbottlesCount, + rewardTier, + transactionHash, + ) + + if err != nil { + log.Fatal(func(k *log.Log) { + k.Context = Context + k.Message = "Failed to update an aggregated user transaction with a lootbottle" + k.Payload = err + }) + } + + rows, _ := r.RowsAffected() + + if rows != 1 { + log.Fatal(func(k *log.Log) { + k.Context = Context + + k.Format( + "%d rows affected by an aggregate user transaction with lootbottle update, expected 1!", + rows, + ) + + k.Payload = err + }) + } +} diff --git a/lib/types/user-actions/user-actions.go b/lib/types/user-actions/user-actions.go index f799592ae..fecc3eb6a 100644 --- a/lib/types/user-actions/user-actions.go +++ b/lib/types/user-actions/user-actions.go @@ -132,7 +132,7 @@ type ( // AggregatedTransactionFromUserAction to create a partially aggregated transaction from a user action func AggregatedTransactionFromUserAction(userAction UserAction) AggregatedUserTransaction { - var ( + var ( senderAddress string recipientAddress string ) @@ -180,7 +180,7 @@ func AggregatedTransactionFromPendingWinner(pendingWinner winners.PendingWinner) SenderAddress: senderAddress, // the sender is the winner of a pending win WinningAddress: senderAddress, - Type: "send", + Type: "send", } if pendingWinner.Utility == "FLUID" { diff --git a/web/app.fluidity.money/app/components/JoeFarmlandsOrCamelotKingdom/index.tsx b/web/app.fluidity.money/app/components/JoeFarmlandsOrCamelotKingdom/index.tsx index 1339df2c4..90d2cc980 100644 --- a/web/app.fluidity.money/app/components/JoeFarmlandsOrCamelotKingdom/index.tsx +++ b/web/app.fluidity.money/app/components/JoeFarmlandsOrCamelotKingdom/index.tsx @@ -7,13 +7,21 @@ export const JoeFarmlandsOrCamelotKingdomLinks = () => [ const JoeFarmlandsOrCamelotKingdom = () => { return (
- + - + { const providerLinks: { provider: Provider; link: string }[] = [ - { provider: "Uniswap", link: "https://app.uniswap.org/#/swap" }, + { provider: "Jumper", link: "https://jumper.exchange/" }, { - provider: "Sushiswap", - link: "https://www.sushi.com/swap?fromChainId=42161&fromCurrency=0x4CFA50B7Ce747e2D61724fcAc57f24B748FF2b2A&toChainId=42161&toCurrency=NATIVE&amount=", + provider: "Trader Joe", + link: "https://traderjoexyz.com/arbitrum/trade?outputCurrency=0x4cfa50b7ce747e2d61724fcac57f24b748ff2b2a", }, { provider: "Camelot", link: "https://app.camelot.exchange/" }, { provider: "Saddle", link: "https://saddle.exchange/#/" }, diff --git a/web/app.fluidity.money/app/routes/$network/dashboard/airdrop/index.tsx b/web/app.fluidity.money/app/routes/$network/dashboard/airdrop/index.tsx index ab33e0a5d..81dec1ff4 100644 --- a/web/app.fluidity.money/app/routes/$network/dashboard/airdrop/index.tsx +++ b/web/app.fluidity.money/app/routes/$network/dashboard/airdrop/index.tsx @@ -24,6 +24,8 @@ import { BloomEffect, toSignificantDecimals, useViewport, + numberToMonetaryString, + toDecimalPlaces, } from "@fluidity-money/surfing"; import { BottlesDetailsModal, @@ -57,7 +59,7 @@ import { ReferralBottlesCountLoaderData } from "../../query/referralBottles"; import { HowItWorksContent } from "~/components/ReferralModal"; import JoeFarmlandsOrCamelotKingdom from "~/components/JoeFarmlandsOrCamelotKingdom"; -const EPOCH_CURRENT_IDENTIFIER = "epoch_1"; +const EPOCH_CURRENT_IDENTIFIER = "epoch_testing"; const AIRDROP_MODALS = [ "recap", @@ -119,7 +121,7 @@ const SAFE_DEFAULT_AIRDROP: AirdropLoaderData = { programEnd: new Date("2023-06-28 T12:00:00+02:00"), epochDaysTotal: 30, epochDaysElapsed: 30, - epochIdentifier: "epoch_1", + epochIdentifier: "", ethereumApplication: "none", epochFound: false, loaded: false, @@ -558,7 +560,6 @@ const Airdrop = () => { onClick={() => setCurrentModal("testnet-rewards")} groupId="airdrop" isSelected={isMobile && currentModal === "testnet-rewards"} - disabled={true} > Testnet Rewards @@ -1164,17 +1165,12 @@ const MultiplierTasks = () => { const [tasks, setTasks] = useState<"1x" | "6x">("6x"); const providerLinks: { provider: Provider; link: string }[] = [ - { provider: "Jumper", link: "https://app.uniswap.org/#/swap" }, - { - provider: "Uniswap", - link: "https://app.uniswap.org/#/swap", - }, - { provider: "Trader Joe", link: "https://app.camelot.exchange/" }, - { provider: "Camelot", link: "https://saddle.exchange/#/" }, - { provider: "Sushiswap", link: "https://app.chronos.exchange/" }, + { provider: "Jumper", link: "https://jumper.exchange/" }, + { provider: "Trader Joe", link: "https://traderjoexyz.com/arbitrum/trade?outputCurrency=0x4cfa50b7ce747e2d61724fcac57f24b748ff2b2a" }, + { provider: "Camelot", link: "https://app.camelot.exchange/" }, { provider: "Ramses", - link: "https://kyberswap.com/swap/arbitrum/fusdc-to-usdc", + link: "https://app.ramses.exchange/liquidity/v2/0xf73c87736008ad3af9973b357c97ab8c60d8ca63", }, ]; @@ -1395,7 +1391,7 @@ const airdropRankRow = ( : {} } > - {fusdcEarned} + {numberToMonetaryString(fusdcEarned)} ); @@ -1412,7 +1408,7 @@ const airdropRankRow = ( : {} } > - {arbEarned} + {toDecimalPlaces(arbEarned, 4)} ); diff --git a/web/app.fluidity.money/app/routes/$network/dashboard/home.tsx b/web/app.fluidity.money/app/routes/$network/dashboard/home.tsx index 0539d1cba..0c30c7f6d 100644 --- a/web/app.fluidity.money/app/routes/$network/dashboard/home.tsx +++ b/web/app.fluidity.money/app/routes/$network/dashboard/home.tsx @@ -21,7 +21,6 @@ import { TabButton, toDecimalPlaces, ProviderIcon, - LootBottle, TokenIcon, } from "@fluidity-money/surfing"; import { useState, useContext, useEffect, useMemo } from "react"; @@ -377,7 +376,6 @@ export default function Home() { logo, utilityTokens, application, - rewardTier, lootboxCount, } = data; @@ -466,11 +464,7 @@ export default function Home() { className="table-address" href={`/${network}/dashboard/airdrop`} > - + { lootboxCount } ) : ( - diff --git a/web/app.fluidity.money/app/routes/$network/query/dashboard/prizePool.tsx b/web/app.fluidity.money/app/routes/$network/query/dashboard/prizePool.tsx index 30fcbda26..182786e8d 100644 --- a/web/app.fluidity.money/app/routes/$network/query/dashboard/prizePool.tsx +++ b/web/app.fluidity.money/app/routes/$network/query/dashboard/prizePool.tsx @@ -25,7 +25,6 @@ export async function loader() { }, ].map(({ network, abi, getPrizePool }) => { const infuraRpc = config.drivers[network][mainnetId].rpc.http; - console.log("infura rpc", infuraRpc); const provider = new JsonRpcProvider(infuraRpc); const rewardPoolAddr = config.contract.prize_pool[network as Chain]; diff --git a/web/app.fluidity.money/app/routes/$network/query/userTransactions.tsx b/web/app.fluidity.money/app/routes/$network/query/userTransactions.tsx index 2000c80a1..fdc412bc7 100644 --- a/web/app.fluidity.money/app/routes/$network/query/userTransactions.tsx +++ b/web/app.fluidity.money/app/routes/$network/query/userTransactions.tsx @@ -12,6 +12,7 @@ import { useUserRewardsByAddress, useUserTransactionsAll, useUserTransactionsByAddress, + translateRewardTierToRarity } from "~/queries"; import { captureException } from "@sentry/react"; import { MintAddress } from "~/types/MintAddress"; @@ -24,6 +25,7 @@ import { useUserActionsAll, useUserActionsByAddress, } from "~/queries/useUserActionsAggregate"; +import { Rarity } from "@fluidity-money/surfing"; import { chainType } from "~/util/chainUtils/chains"; const FLUID_UTILITY = "FLUID"; @@ -38,7 +40,7 @@ type UserTransaction = { value: number; currency: string; application: string; - rewardTier: number; + rewardTier: Rarity; lootboxCount: number; }; @@ -359,9 +361,12 @@ export const loader: LoaderFunction = async ({ params, request }) => { currency: { symbol: currency }, application, lootboxCount, - rewardTier, + rewardTier: rewardTier_, } = transaction; + const rewardTier = + rewardTier_ ?? translateRewardTierToRarity(Object.values(Rarity).indexOf(rewardTier_)); + return { sender, receiver, @@ -377,7 +382,7 @@ export const loader: LoaderFunction = async ({ params, request }) => { currency, application, lootboxCount, - rewardTier, + rewardTier }; } ); diff --git a/web/app.fluidity.money/app/routes/$network/query/winningUserTransactions.tsx b/web/app.fluidity.money/app/routes/$network/query/winningUserTransactions.tsx index 7380b3d3e..dacce59c3 100644 --- a/web/app.fluidity.money/app/routes/$network/query/winningUserTransactions.tsx +++ b/web/app.fluidity.money/app/routes/$network/query/winningUserTransactions.tsx @@ -8,7 +8,9 @@ import { useUserRewardsAll, useUserRewardsByAddress, useUserTransactionsByTxHash, + translateRewardTierToRarity } from "~/queries"; +import { Rarity } from "@fluidity-money/surfing"; import { captureException } from "@sentry/react"; import { MintAddress } from "~/types/MintAddress"; import { Winner } from "~/queries/useUserRewards"; @@ -26,8 +28,8 @@ type UserTransaction = { value: number; currency: string; application: string; + rewardTier: Rarity; lootboxCount: number; - rewardTier: number; }; export type TransactionsLoaderData = { @@ -208,10 +210,13 @@ export const loader: LoaderFunction = async ({ params, request }) => { amount: value, currency: { symbol: currency }, application, - lootboxCount, - rewardTier, + rewardTier: rewardTier_, + lootboxCount } = transaction; + const rewardTier = + rewardTier_ ?? translateRewardTierToRarity(Object.values(Rarity).indexOf(rewardTier_)); + return { sender, receiver, @@ -292,8 +297,8 @@ export const loader: LoaderFunction = async ({ params, request }) => { swapType, utilityTokens: winner.utility, application: tx.application, - lootboxCount: tx.lootboxCount, rewardTier: tx.rewardTier, + lootboxCount: tx.lootboxCount, }; }); @@ -316,4 +321,4 @@ export const loader: LoaderFunction = async ({ params, request }) => { ); return new Error("Server could not fulfill request"); } -}; +}; \ No newline at end of file diff --git a/web/app.fluidity.money/app/styles/dashboard.css b/web/app.fluidity.money/app/styles/dashboard.css index 7d3166ba0..443d14bf4 100644 --- a/web/app.fluidity.money/app/styles/dashboard.css +++ b/web/app.fluidity.money/app/styles/dashboard.css @@ -149,20 +149,7 @@ body { background-repeat: no-repeat; background-size: 100%; background-position: 0 0, 100% 0, 100% 100%, 0 100%; - background-image: linear-gradient( - 45deg, - #f3b8d8, - #b793e9, - #9fd4f3, - #ffd2c4, - #fbf3f3, - #d9abdf, - #af9ce3, - #aae4e1, - #c6ead0, - #ffffff, - #fdb5e4 - ); + background-image: linear-gradient(45deg, #f3b8d8, #b793e9, #9fd4f3, #ffd2c4, #fbf3f3, #d9abdf, #af9ce3, #aae4e1, #c6ead0, #ffffff, #fdb5e4); animation: rotate 4s linear infinite; } @@ -630,20 +617,7 @@ ul.sidebar-nav li div.active { } .holo { - background: conic-gradient( - from 209.59deg at 50% 50%, - #f3b8d8 0deg, - #b793e9 50.06deg, - #9fd4f3 85.94deg, - #ffd2c4 134.97deg, - #fbf3f3 172.05deg, - #d9abdf 200.75deg, - #af9ce3 224.67deg, - #aae4e1 259.36deg, - #c6ead0 298.82deg, - #ffffff 328.72deg, - #fdb5e4 360deg - ); + background: conic-gradient(from 209.59deg at 50% 50%, #f3b8d8 0deg, #b793e9 50.06deg, #9fd4f3 85.94deg, #ffd2c4 134.97deg, #fbf3f3 172.05deg, #d9abdf 200.75deg, #af9ce3 224.67deg, #aae4e1 259.36deg, #c6ead0 298.82deg, #ffffff 328.72deg, #fdb5e4 360deg); height: 40px; width: 40px; border-radius: 50%; diff --git a/web/app.fluidity.money/app/styles/dashboard/airdrop.css b/web/app.fluidity.money/app/styles/dashboard/airdrop.css index 4e0b8e444..3d22d2968 100644 --- a/web/app.fluidity.money/app/styles/dashboard/airdrop.css +++ b/web/app.fluidity.money/app/styles/dashboard/airdrop.css @@ -273,19 +273,7 @@ } .transaction-table > thead > tr.highlighted-row, .transaction-table > tbody > tr.airdrop-row.highlighted-row { - background: linear-gradient( - 90deg, - #f3b8d8 0%, - #b793e9 15.1%, - #9fd4f3 26.04%, - #ffd2c4 36.46%, - #fbf3f3 46.88%, - #d9abdf 57.29%, - #af9ce3 72.4%, - #aae4e1 85.42%, - #c6ead0 93.23%, - #fdb5e4 100% - ); + background: linear-gradient(90deg, #f3b8d8 0%, #b793e9 15.1%, #9fd4f3 26.04%, #ffd2c4 36.46%, #fbf3f3 46.88%, #d9abdf 57.29%, #af9ce3 72.4%, #aae4e1 85.42%, #c6ead0 93.23%, #fdb5e4 100%); } .transaction-table > thead > tr.highlighted-row td, .transaction-table > tbody > tr.airdrop-row.highlighted-row td { @@ -314,30 +302,14 @@ } .airdrop-leaderboard-mobile .transaction-table > thead > tr td:first-child, .airdrop-leaderboard-mobile .transaction-table > thead > tr th:first-child, -.airdrop-leaderboard-mobile - .transaction-table - > tbody - > tr.airdrop-row - td:first-child, -.airdrop-leaderboard-mobile - .transaction-table - > tbody - > tr.airdrop-row - th:first-child { +.airdrop-leaderboard-mobile .transaction-table > tbody > tr.airdrop-row td:first-child, +.airdrop-leaderboard-mobile .transaction-table > tbody > tr.airdrop-row th:first-child { padding-left: 1em; } .airdrop-leaderboard-mobile .transaction-table > thead > tr td:last-child, .airdrop-leaderboard-mobile .transaction-table > thead > tr th:last-child, -.airdrop-leaderboard-mobile - .transaction-table - > tbody - > tr.airdrop-row - td:last-child, -.airdrop-leaderboard-mobile - .transaction-table - > tbody - > tr.airdrop-row - th:last-child { +.airdrop-leaderboard-mobile .transaction-table > tbody > tr.airdrop-row td:last-child, +.airdrop-leaderboard-mobile .transaction-table > tbody > tr.airdrop-row th:last-child { padding-right: 1em; } .airdrop-leaderboard-mobile .transaction-table > thead > tr td, @@ -708,10 +680,7 @@ align-items: flex-start; gap: 0.5em; } -.staking-stats-container - .staking-stats-stakes-container - .stake - .stake-multiplier { +.staking-stats-container .staking-stats-stakes-container .stake .stake-multiplier { width: 100%; display: flex; flex-wrap: wrap; @@ -784,31 +753,18 @@ width: 150px; height: 150px; } -.recap-container - .recap-hero - .recap-hero-text - .recap-circle-scroll - .recap-circle-scroll-arrow { +.recap-container .recap-hero .recap-hero-text .recap-circle-scroll .recap-circle-scroll-arrow { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } -.recap-container - .recap-hero - .recap-hero-text - .recap-circle-scroll - .recap-circle-scroll-arrow - svg { +.recap-container .recap-hero .recap-hero-text .recap-circle-scroll .recap-circle-scroll-arrow svg { fill: none; stroke: white; transform: scale(3); } -.recap-container - .recap-hero - .recap-hero-text - .recap-circle-scroll - .recap-circle-scroll-text { +.recap-container .recap-hero .recap-hero-text .recap-circle-scroll .recap-circle-scroll-text { font-size: 10px; fill: grey; letter-spacing: 0.4em; @@ -900,28 +856,19 @@ /* Track */ /* Handle */ } -.recap-container - .recap-stats - .recap-bottle-distribution-container::-webkit-scrollbar { +.recap-container .recap-stats .recap-bottle-distribution-container::-webkit-scrollbar { height: 10px; } -.recap-container - .recap-stats - .recap-bottle-distribution-container::-webkit-scrollbar-track { +.recap-container .recap-stats .recap-bottle-distribution-container::-webkit-scrollbar-track { background: transparent; border: 1px solid white; border-radius: 5px; } -.recap-container - .recap-stats - .recap-bottle-distribution-container::-webkit-scrollbar-thumb { +.recap-container .recap-stats .recap-bottle-distribution-container::-webkit-scrollbar-thumb { background: white; border-radius: 5px; } -.recap-container - .recap-stats - .recap-bottle-distribution-container - .bottle-container { +.recap-container .recap-stats .recap-bottle-distribution-container .bottle-container { gap: 1em; display: flex; flex-direction: column; diff --git a/web/app.fluidity.money/app/styles/transfer.css b/web/app.fluidity.money/app/styles/transfer.css index 0d4055653..337cd2928 100644 --- a/web/app.fluidity.money/app/styles/transfer.css +++ b/web/app.fluidity.money/app/styles/transfer.css @@ -276,20 +276,7 @@ body { right: 0; bottom: 0; z-index: 1; - background: conic-gradient( - from 209.59deg at 50% 50%, - #f3b8d8 0deg, - #b793e9 50.06deg, - #9fd4f3 85.94deg, - #ffd2c4 134.97deg, - #fbf3f3 172.05deg, - #d9abdf 200.75deg, - #af9ce3 224.67deg, - #aae4e1 259.36deg, - #c6ead0 298.82deg, - #ffffff 328.72deg, - #fdb5e4 360deg - ); + background: conic-gradient(from 209.59deg at 50% 50%, #f3b8d8 0deg, #b793e9 50.06deg, #9fd4f3 85.94deg, #ffd2c4 134.97deg, #fbf3f3 172.05deg, #d9abdf 200.75deg, #af9ce3 224.67deg, #aae4e1 259.36deg, #c6ead0 298.82deg, #ffffff 328.72deg, #fdb5e4 360deg); filter: blur(10px); scale: 1.1; } diff --git a/web/app.fluidity.money/app/types/Transaction.ts b/web/app.fluidity.money/app/types/Transaction.ts index 47597bc68..5c01555eb 100644 --- a/web/app.fluidity.money/app/types/Transaction.ts +++ b/web/app.fluidity.money/app/types/Transaction.ts @@ -1,3 +1,5 @@ +import { Rarity } from "@fluidity-money/surfing"; + type Transaction = { sender: string; receiver: string; @@ -14,7 +16,7 @@ type Transaction = { swapType?: "in" | "out"; utilityTokens?: { [tokens: string]: number }; application: string; - rewardTier: number; + rewardTier: Rarity; lootboxCount: number; }; diff --git a/web/app.fluidity.money/config.toml b/web/app.fluidity.money/config.toml index a92e6d18e..d55563b02 100644 --- a/web/app.fluidity.money/config.toml +++ b/web/app.fluidity.money/config.toml @@ -341,10 +341,10 @@ fUSDT = "https://app.meteora.ag" [liquidity_providers.arbitrum] [[liquidity_providers.arbitrum.providers]] -name= "uniswap" +name= "trader_joe" [liquidity_providers.arbitrum.providers.link] -fUSDC = "https://app.uniswap.org/#/add/0xaf88d065e77c8cC2239327C5EDb3A432268e5831/0x4CFA50B7Ce747e2D61724fcAc57f24B748FF2b2A/500" +fUSDC = "https://traderjoexyz.com/arbitrum/pool/v21/0x4cfa50b7ce747e2d61724fcac57f24b748ff2b2a/0x912ce59144191c1204e64559fe8253a0e49e6548/25" [[liquidity_providers.arbitrum.providers]] name= "camelot" @@ -353,10 +353,16 @@ name= "camelot" fUSDC = "https://app.camelot.exchange/liquidity/?token1=0xaf88d065e77c8cC2239327C5EDb3A432268e5831&token2=0x4CFA50B7Ce747e2D61724fcAc57f24B748FF2b2A" [[liquidity_providers.arbitrum.providers]] -name= "Chronos" +name= "Ramses" + +[liquidity_providers.arbitrum.providers.link] +fUSDC = "https://app.ramses.exchange/liquidity/v2/0xf73c87736008ad3af9973b357c97ab8c60d8ca63" + +[[liquidity_providers.arbitrum.providers]] +name= "uniswap" [liquidity_providers.arbitrum.providers.link] -fUSDC = "https://app.chronos.exchange/liquidity" +fUSDC = "https://app.uniswap.org/#/add/0xaf88d065e77c8cC2239327C5EDb3A432268e5831/0x4CFA50B7Ce747e2D61724fcAc57f24B748FF2b2A/500" [[config.ethereum.wallets]] name = "Browser"