From 03ab40067ed1f3386c6876494d88a8bcecda1bd3 Mon Sep 17 00:00:00 2001 From: Malcolm Sparrow Date: Fri, 22 Nov 2019 09:11:03 +0000 Subject: [PATCH] Promotion expiration Resolves https://github.com/brave/brave-browser/issues/6947 --- .../database/database_unblinded_token.cc | 25 ++++++++++++++++ .../database/database_unblinded_token.h | 6 ++-- .../database/publisher_info_database.cc | 11 +++++++ .../database/publisher_info_database.h | 3 ++ .../browser/rewards_service_impl.cc | 26 ++++++++++++++++ .../browser/rewards_service_impl.h | 4 +++ .../android_page/components/pageWallet.tsx | 3 +- .../extension/brave_rewards/utils.ts | 3 +- .../resources/page/components/pageWallet.tsx | 3 +- .../bat_ledger_client_mojo_proxy.cc | 8 +++++ .../bat_ledger/bat_ledger_client_mojo_proxy.h | 4 +++ .../public/cpp/ledger_client_mojo_proxy.cc | 24 +++++++++++++++ .../public/cpp/ledger_client_mojo_proxy.h | 8 +++++ .../public/interfaces/bat_ledger.mojom | 1 + .../internal/confirmations_client_mock.h | 4 +++ .../include/bat/ledger/ledger_client.h | 8 +++-- .../bat/ledger/internal/ledger_client_mock.h | 3 ++ .../src/bat/ledger/internal/ledger_impl.cc | 6 ++++ .../src/bat/ledger/internal/ledger_impl.h | 4 +++ .../bat/ledger/internal/ledger_impl_mock.h | 3 ++ .../ledger/internal/promotion/promotion.cc | 30 +++++++++++++++++++ vendor/brave-ios/Ledger/BATBraveLedger.mm | 5 ++++ .../Ledger/Generated/NativeLedgerClient.h | 1 + .../Ledger/Generated/NativeLedgerClient.mm | 3 ++ .../Generated/NativeLedgerClientBridge.h | 1 + 25 files changed, 189 insertions(+), 8 deletions(-) diff --git a/components/brave_rewards/browser/database/database_unblinded_token.cc b/components/brave_rewards/browser/database/database_unblinded_token.cc index f8e06ea00d8d..08cbdae57939 100644 --- a/components/brave_rewards/browser/database/database_unblinded_token.cc +++ b/components/brave_rewards/browser/database/database_unblinded_token.cc @@ -16,6 +16,13 @@ namespace brave_rewards { +namespace { + +const char* table_name_ = "unblinded_tokens"; +const int minimum_version_ = 10; + +} // namespace + DatabaseUnblindedToken::DatabaseUnblindedToken( int current_db_version) : DatabaseTable(current_db_version) { @@ -157,4 +164,22 @@ bool DatabaseUnblindedToken::DeleteRecords( return statement.Run(); } +// static +bool DatabaseUnblindedToken::DeleteRecordsForPromotion( + sql::Database* db, + const std::string& promotion_id) { + if (promotion_id.empty()) { + return false; + } + + const std::string query = base::StringPrintf( + "DELETE FROM %s WHERE promotion_id = '%s'", + table_name_, + promotion_id.c_str()); + + sql::Statement statement(db->GetUniqueStatement(query.c_str())); + + return statement.Run(); +} + } // namespace brave_rewards diff --git a/components/brave_rewards/browser/database/database_unblinded_token.h b/components/brave_rewards/browser/database/database_unblinded_token.h index 5c73ab2a02b6..3a2ac67df432 100644 --- a/components/brave_rewards/browser/database/database_unblinded_token.h +++ b/components/brave_rewards/browser/database/database_unblinded_token.h @@ -35,9 +35,9 @@ class DatabaseUnblindedToken: public DatabaseTable { sql::Database* db, const std::vector& id_list); - private: - const char* table_name_ = "unblinded_tokens"; - const int minimum_version_ = 10; + static bool DeleteRecordsForPromotion( + sql::Database* db, + const std::string& promotion_id); }; } // namespace brave_rewards diff --git a/components/brave_rewards/browser/database/publisher_info_database.cc b/components/brave_rewards/browser/database/publisher_info_database.cc index fb5e97419abe..5f2394a9823d 100644 --- a/components/brave_rewards/browser/database/publisher_info_database.cc +++ b/components/brave_rewards/browser/database/publisher_info_database.cc @@ -527,6 +527,17 @@ bool PublisherInfoDatabase::DeleteUnblindedTokens( return unblinded_token_->DeleteRecords(&GetDB(), id_list); } +bool PublisherInfoDatabase::DeleteUnblindedTokensForPromotion( + const std::string& promotion_id) { + if (!IsInitialized()) { + return false; + } + + return DatabaseUnblindedToken::DeleteRecordsForPromotion( + &GetDB(), + promotion_id); +} + // Other ------------------------------------------------------------------- bool PublisherInfoDatabase::IsInitialized() { diff --git a/components/brave_rewards/browser/database/publisher_info_database.h b/components/brave_rewards/browser/database/publisher_info_database.h index 3750b974443b..e250a040fbbc 100644 --- a/components/brave_rewards/browser/database/publisher_info_database.h +++ b/components/brave_rewards/browser/database/publisher_info_database.h @@ -128,6 +128,9 @@ class PublisherInfoDatabase { bool DeleteUnblindedTokens(const std::vector& id_list); + bool DeleteUnblindedTokensForPromotion( + const std::string& promotion_id); + void RecordP3AStats(bool auto_contributions_on); // Returns the current version of the publisher info database diff --git a/components/brave_rewards/browser/rewards_service_impl.cc b/components/brave_rewards/browser/rewards_service_impl.cc index eaf693ddc2ff..d3e813321ca4 100644 --- a/components/brave_rewards/browser/rewards_service_impl.cc +++ b/components/brave_rewards/browser/rewards_service_impl.cc @@ -4306,6 +4306,32 @@ void RewardsServiceImpl::DeleteUnblindedTokens( callback)); } +ledger::Result DeleteUnblindedTokensForPromotionOnFileTaskRunner( + PublisherInfoDatabase* backend, + const std::string& promotion_id) { + if (!backend) { + return ledger::Result::LEDGER_ERROR; + } + + const bool result = backend->DeleteUnblindedTokensForPromotion(promotion_id); + + return result ? ledger::Result::LEDGER_OK : ledger::Result::LEDGER_ERROR; +} + +void RewardsServiceImpl::DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + ledger::ResultCallback callback) { + base::PostTaskAndReplyWithResult( + file_task_runner_.get(), + FROM_HERE, + base::BindOnce(&DeleteUnblindedTokensForPromotionOnFileTaskRunner, + publisher_info_backend_.get(), + promotion_id), + base::BindOnce(&RewardsServiceImpl::OnResult, + AsWeakPtr(), + callback)); +} + ledger::ClientInfoPtr GetDesktopClientInfo() { auto info = ledger::ClientInfo::New(); info->platform = ledger::Platform::DESKTOP; diff --git a/components/brave_rewards/browser/rewards_service_impl.h b/components/brave_rewards/browser/rewards_service_impl.h index a31ce2f28757..9eab86b5cd6e 100644 --- a/components/brave_rewards/browser/rewards_service_impl.h +++ b/components/brave_rewards/browser/rewards_service_impl.h @@ -728,6 +728,10 @@ class RewardsServiceImpl : public RewardsService, const std::vector& id_list, ledger::ResultCallback callback) override; + void DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + ledger::ResultCallback callback) override; + ledger::ClientInfoPtr GetClientInfo() override; void UnblindedTokensReady() override; diff --git a/components/brave_rewards/resources/android_page/components/pageWallet.tsx b/components/brave_rewards/resources/android_page/components/pageWallet.tsx index 0d30da51ed74..103b6a60d390 100644 --- a/components/brave_rewards/resources/android_page/components/pageWallet.tsx +++ b/components/brave_rewards/resources/android_page/components/pageWallet.tsx @@ -56,7 +56,8 @@ class PageWallet extends React.Component { } let claimedPromotions = promotions.filter((promotion: Rewards.Promotion) => { - return promotion.status === 4 // PromotionStatus::FINISHED + return promotion.status === 4 || // PromotionStatus::FINISHED + promotion.status === 5 // PromotionStatus::OVER }) return claimedPromotions.map((promotion: Rewards.Promotion) => { diff --git a/components/brave_rewards/resources/extension/brave_rewards/utils.ts b/components/brave_rewards/resources/extension/brave_rewards/utils.ts index febe67da410c..9ef99b2affe7 100644 --- a/components/brave_rewards/resources/extension/brave_rewards/utils.ts +++ b/components/brave_rewards/resources/extension/brave_rewards/utils.ts @@ -41,7 +41,8 @@ export const generatePromotions = (promotions?: RewardsExtension.Promotion[]) => } let claimedPromotions = promotions.filter((promotion: Rewards.Promotion) => { - return promotion.status === 4 // PromotionStatus::FINISHED + return promotion.status === 4 || // PromotionStatus::FINISHED + promotion.status === 5 // PromotionStatus::OVER }) const typeUGP = 0 diff --git a/components/brave_rewards/resources/page/components/pageWallet.tsx b/components/brave_rewards/resources/page/components/pageWallet.tsx index b5a70899d7ea..d218c022fd0c 100644 --- a/components/brave_rewards/resources/page/components/pageWallet.tsx +++ b/components/brave_rewards/resources/page/components/pageWallet.tsx @@ -159,7 +159,8 @@ class PageWallet extends React.Component { } let claimedPromotions = promotions.filter((promotion: Rewards.Promotion) => { - return promotion.status === 4 // PromotionStatus::FINISHED + return promotion.status === 4 || // PromotionStatus::FINISHED + promotion.status === 5 // PromotionStatus::OVER }) const typeUGP = 0 diff --git a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc index bb943aa24a04..d4a9225b2c81 100644 --- a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc +++ b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.cc @@ -1026,6 +1026,14 @@ void BatLedgerClientMojoProxy::DeleteUnblindedTokens( base::BindOnce(&OnResultCallback, std::move(callback))); } +void BatLedgerClientMojoProxy::DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + ledger::ResultCallback callback) { + bat_ledger_client_->DeleteUnblindedTokensForPromotion( + promotion_id, + base::BindOnce(&OnResultCallback, std::move(callback))); +} + ledger::ClientInfoPtr BatLedgerClientMojoProxy::GetClientInfo() { auto info = ledger::ClientInfo::New(); bat_ledger_client_->GetClientInfo(&info); diff --git a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h index 27eeaf067e5c..d4896edec714 100644 --- a/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h +++ b/components/services/bat_ledger/bat_ledger_client_mojo_proxy.h @@ -228,6 +228,10 @@ class BatLedgerClientMojoProxy : public ledger::LedgerClient, const std::vector& id_list, ledger::ResultCallback callback) override; + void DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + ledger::ResultCallback callback) override; + ledger::ClientInfoPtr GetClientInfo() override; void UnblindedTokensReady() override; diff --git a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc index 736dd3af61f0..9125e25c42c6 100644 --- a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc +++ b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.cc @@ -1179,6 +1179,30 @@ void LedgerClientMojoProxy::DeleteUnblindedTokens( _1)); } +// static +void LedgerClientMojoProxy::OnDeleteUnblindedTokensForPromotion( + CallbackHolder* holder, + const ledger::Result result) { + DCHECK(holder); + if (holder->is_valid()) { + std::move(holder->get()).Run(result); + } + delete holder; +} + +void LedgerClientMojoProxy::DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + DeleteUnblindedTokensForPromotionCallback callback) { + auto* holder = new CallbackHolder( + AsWeakPtr(), + std::move(callback)); + ledger_client_->DeleteUnblindedTokensForPromotion( + promotion_id, + std::bind(LedgerClientMojoProxy::OnDeleteUnblindedTokensForPromotion, + holder, + _1)); +} + void LedgerClientMojoProxy::GetClientInfo( GetClientInfoCallback callback) { auto info = ledger_client_->GetClientInfo(); diff --git a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h index e618f466fcdb..b008bf547c2d 100644 --- a/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h +++ b/components/services/bat_ledger/public/cpp/ledger_client_mojo_proxy.h @@ -247,6 +247,10 @@ class LedgerClientMojoProxy : public mojom::BatLedgerClient, const std::vector& id_list, DeleteUnblindedTokensCallback callback) override; + void DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + DeleteUnblindedTokensForPromotionCallback callback) override; + void GetClientInfo( GetClientInfoCallback callback) override; @@ -460,6 +464,10 @@ class LedgerClientMojoProxy : public mojom::BatLedgerClient, CallbackHolder* holder, const ledger::Result result); + static void OnDeleteUnblindedTokensForPromotion( + CallbackHolder* holder, + const ledger::Result result); + ledger::LedgerClient* ledger_client_; DISALLOW_COPY_AND_ASSIGN(LedgerClientMojoProxy); diff --git a/components/services/bat_ledger/public/interfaces/bat_ledger.mojom b/components/services/bat_ledger/public/interfaces/bat_ledger.mojom index 6eebd598db24..09202b050ea6 100644 --- a/components/services/bat_ledger/public/interfaces/bat_ledger.mojom +++ b/components/services/bat_ledger/public/interfaces/bat_ledger.mojom @@ -293,6 +293,7 @@ interface BatLedgerClient { InsertOrUpdateUnblindedToken(ledger.mojom.UnblindedToken info) => (ledger.mojom.Result result); GetAllUnblindedTokens() => (array info); DeleteUnblindedTokens(array id_list) => (ledger.mojom.Result result); + DeleteUnblindedTokensForPromotion(string promotion_id) => (ledger.mojom.Result result); [Sync] GetClientInfo() => (ledger.mojom.ClientInfo info); UnblindedTokensReady(); diff --git a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_client_mock.h b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_client_mock.h index 70ba52ca9ea1..ab9d5a1d3a6f 100644 --- a/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_client_mock.h +++ b/vendor/bat-native-confirmations/src/bat/confirmations/internal/confirmations_client_mock.h @@ -368,6 +368,10 @@ class MockConfirmationsClient : public ConfirmationsClient { const std::vector& id_list, ledger::ResultCallback callback)); + MOCK_METHOD2(DeleteUnblindedTokensForPromotion, void( + const std::string& promotion_id, + ledger::ResultCallback callback)); + MOCK_METHOD0(GetClientInfo, ledger::ClientInfoPtr()); MOCK_METHOD0(UnblindedTokensReady, void()); diff --git a/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h b/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h index 4e314c58f796..cfdb90981f21 100644 --- a/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h +++ b/vendor/bat-native-ledger/include/bat/ledger/ledger_client.h @@ -311,8 +311,12 @@ class LEDGER_EXPORT LedgerClient { ledger::GetAllUnblindedTokensCallback callback) = 0; virtual void DeleteUnblindedTokens( - const std::vector& id_list, - ledger::ResultCallback callback) = 0; + const std::vector& id_list, + ledger::ResultCallback callback) = 0; + + virtual void DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + ledger::ResultCallback callback) = 0; virtual ledger::ClientInfoPtr GetClientInfo() = 0; diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h index d1b4497c77b3..0a09e25912a1 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_client_mock.h @@ -371,6 +371,9 @@ class MockLedgerClient : public LedgerClient { MOCK_METHOD0(GetClientInfo, ledger::ClientInfoPtr()); MOCK_METHOD0(UnblindedTokensReady, void()); + + MOCK_METHOD2(DeleteUnblindedTokensForPromotion, + void(const std::string& promotion_id, ledger::ResultCallback)); }; } // namespace ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc index 35566ee39682..6c9ad0e995ac 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.cc @@ -1541,6 +1541,12 @@ void LedgerImpl::DeleteUnblindedTokens( ledger_client_->DeleteUnblindedTokens(id_list, callback); } +void LedgerImpl::DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + ledger::ResultCallback callback) { + ledger_client_->DeleteUnblindedTokensForPromotion(promotion_id, callback); +} + ledger::ClientInfoPtr LedgerImpl::GetClientInfo() { return ledger_client_->GetClientInfo(); } diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h index 11024312b51b..6d9921cd54e6 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl.h @@ -590,6 +590,10 @@ class LedgerImpl : public ledger::Ledger, const std::vector& id_list, ledger::ResultCallback callback); + void DeleteUnblindedTokensForPromotion( + const std::string& promotion_id, + ledger::ResultCallback callback); + ledger::ClientInfoPtr GetClientInfo(); void UnblindedTokensReady(); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h index 5efd9f16eb8c..cc303181d897 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/ledger_impl_mock.h @@ -565,6 +565,9 @@ class MockLedgerImpl : public LedgerImpl { MOCK_METHOD0(UnblindedTokensReady, void()); MOCK_METHOD1(GetAnonWalletStatus, void(ledger::ResultCallback)); + + MOCK_METHOD2(DeleteUnblindedTokensForPromotion, + void(const std::string& promotion_id, ledger::ResultCallback)); }; } // namespace bat_ledger diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc index fcab302320a0..f2533b737ead 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/promotion/promotion.cc @@ -40,6 +40,32 @@ using challenge_bypass_ristretto::UnblindedToken; namespace braveledger_promotion { +namespace { + +void HandleExpiredPromotions( + bat_ledger::LedgerImpl* ledger, + ledger::PromotionMap* promotions) { + DCHECK(promotions); + if (!promotions) { + return; + } + + const uint64_t current_time = + static_cast(base::Time::Now().ToDoubleT()); + + for (auto& item : *promotions) { + if (item.second->expires_at > 0 && + item.second->expires_at <= current_time) { + item.second->status = ledger::PromotionStatus::OVER; + + ledger->DeleteUnblindedTokensForPromotion(item.second->id, + [](const ledger::Result _){}); + } + } +} + +} // namespace + Promotion::Promotion(bat_ledger::LedgerImpl* ledger) : attestation_(std::make_unique (ledger)), @@ -128,6 +154,8 @@ void Promotion::OnGetAllPromotions( ledger::PromotionMap promotions, const std::string& response, ledger::FetchPromotionCallback callback) { + HandleExpiredPromotions(ledger_, &promotions); + ledger::PromotionList list; bool success = ParseFetchResponse(response, &list); @@ -284,6 +312,8 @@ void Promotion::OnTimer(const uint32_t timer_id) { } void Promotion::Retry(ledger::PromotionMap promotions) { + HandleExpiredPromotions(ledger_, &promotions); + for (auto & promotion : promotions) { if (promotion.second->status == ledger::PromotionStatus::CLAIMED) { FetchSignedTokens( diff --git a/vendor/brave-ios/Ledger/BATBraveLedger.mm b/vendor/brave-ios/Ledger/BATBraveLedger.mm index 4bdcb757b577..a6f599cfb005 100644 --- a/vendor/brave-ios/Ledger/BATBraveLedger.mm +++ b/vendor/brave-ios/Ledger/BATBraveLedger.mm @@ -1997,4 +1997,9 @@ - (void)unblindedTokensReady } } +- (void)deleteUnblindedTokensForPromotion:(const std::string&)promotion_id callback:(ledger::ResultCallback)callback +{ + // TODO please implement +} + @end diff --git a/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.h b/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.h index cb4368b25da2..de809b544e0e 100644 --- a/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.h +++ b/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.h @@ -94,6 +94,7 @@ class NativeLedgerClient : public ledger::LedgerClient { void InsertOrUpdateUnblindedToken(ledger::UnblindedTokenPtr info, ledger::ResultCallback callback) override; void GetAllUnblindedTokens(ledger::GetAllUnblindedTokensCallback callback) override; void DeleteUnblindedTokens(const std::vector& id_list, ledger::ResultCallback callback) override; + void DeleteUnblindedTokensForPromotion(const std::string& promotion_id, ledger::ResultCallback callback) override; ledger::ClientInfoPtr GetClientInfo() override; void UnblindedTokensReady() override; }; diff --git a/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.mm b/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.mm index 9ae41fd9d399..982349d475f1 100644 --- a/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.mm +++ b/vendor/brave-ios/Ledger/Generated/NativeLedgerClient.mm @@ -255,3 +255,6 @@ void NativeLedgerClient::GetAllPromotions(ledger::GetAllPromotionsCallback callback) { [bridge_ getAllPromotions:callback]; } +void NativeLedgerClient::DeleteUnblindedTokensForPromotion(const std::string& promotion_id, ledger::ResultCallback callback) { + [bridge_ deleteUnblindedTokensForPromotion:promotion_id callback:callback]; +} diff --git a/vendor/brave-ios/Ledger/Generated/NativeLedgerClientBridge.h b/vendor/brave-ios/Ledger/Generated/NativeLedgerClientBridge.h index 5ffbfc0dd61d..7e5a4de2256a 100644 --- a/vendor/brave-ios/Ledger/Generated/NativeLedgerClientBridge.h +++ b/vendor/brave-ios/Ledger/Generated/NativeLedgerClientBridge.h @@ -89,5 +89,6 @@ - (ledger::ClientInfoPtr)getClientInfo; - (void)unblindedTokensReady; - (void)getAllPromotions:(ledger::GetAllPromotionsCallback)callback; +- (void)deleteUnblindedTokensForPromotion:(const std::string&)promotion_id callback:(ledger::ResultCallback)callback; @end