From aef7efcee3005c1be189a72812559383d02d0ada Mon Sep 17 00:00:00 2001 From: Patrick Loughrey Date: Fri, 10 Jul 2026 11:25:14 -0400 Subject: [PATCH] CSOL-899: Update Prebid Server currency conversion logic --- adapters/triplelift/triplelift.go | 36 ++++++-- .../triplelift/triplelift_currency_test.go | 91 +++++++++++++++++++ .../exemplary/optional-params.json | 1 + .../exemplary/simple-banner-eur-floor.json | 83 +++++++++++++++++ .../exemplary/simple-video.json | 1 + .../supplemental/video-format-11.json | 1 + .../supplemental/video-format-12.json | 1 + .../supplemental/video-format-17.json | 1 + .../triplelift_native/triplelift_native.go | 38 ++++++-- .../triplelift_native_currency_test.go | 76 ++++++++++++++++ .../exemplary/app-msn-no-tag-code.json | 1 + .../exemplary/app-msn.json | 1 + .../triplelift_nativetest/exemplary/app.json | 1 + .../exemplary/site-msn-no-tag-code.json | 1 + .../exemplary/site-msn.json | 1 + .../triplelift_nativetest/exemplary/site.json | 1 + .../supplemental/app-publisher-no-domain.json | 1 + .../effective-publisher-allowed.json | 1 + .../site-publisher-no-domain.json | 1 + 19 files changed, 326 insertions(+), 12 deletions(-) create mode 100644 adapters/triplelift/triplelift_currency_test.go create mode 100644 adapters/triplelift/triplelifttest/exemplary/simple-banner-eur-floor.json create mode 100644 adapters/triplelift_native/triplelift_native_currency_test.go diff --git a/adapters/triplelift/triplelift.go b/adapters/triplelift/triplelift.go index 736773075e..d50d7b982d 100644 --- a/adapters/triplelift/triplelift.go +++ b/adapters/triplelift/triplelift.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v4/adapters" @@ -33,7 +34,7 @@ func getBidType(ext TripleliftRespExt) openrtb_ext.BidType { return openrtb_ext.BidTypeBanner } -func processImp(imp *openrtb2.Imp) error { +func processImp(imp *openrtb2.Imp, reqInfo *adapters.ExtraRequestInfo) error { // get the triplelift extension var ext adapters.ExtImpBidder var tlext openrtb_ext.ExtImpTriplelift @@ -48,15 +49,35 @@ func processImp(imp *openrtb2.Imp) error { } imp.TagID = tlext.InvCode // floor is optional - if tlext.Floor == nil { - return nil - } else { - imp.BidFloor = *tlext.Floor + if tlext.Floor != nil { + imp.BidFloor = *tlext.Floor + } + // Normalize bid floor to USD - TLX expects USD + if err := resolveBidFloorCurrency(imp, reqInfo); err != nil { + return err } // no error return nil } +// Normalize imp.BidFloor to USD +func resolveBidFloorCurrency(imp *openrtb2.Imp, reqInfo *adapters.ExtraRequestInfo) error { + if imp.BidFloor <= 0 { + return nil + } + if imp.BidFloorCur != "" && strings.ToUpper(imp.BidFloorCur) != "USD" { + converted, err := reqInfo.ConvertCurrency(imp.BidFloor, imp.BidFloorCur, "USD") + if err != nil { + return &errortypes.BadInput{ + Message: fmt.Sprintf("Unable to convert bid floor from %s to USD: %s", imp.BidFloorCur, err.Error()), + } + } + imp.BidFloor = converted + } + imp.BidFloorCur = "USD" + return nil +} + func (a *TripleliftAdapter) MakeRequests(request *openrtb2.BidRequest, extra *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { errs := make([]error, 0, len(request.Imp)+1) reqs := make([]*adapters.RequestData, 0, 1) @@ -66,7 +87,7 @@ func (a *TripleliftAdapter) MakeRequests(request *openrtb2.BidRequest, extra *ad var validImps []openrtb2.Imp // pre-process the imps for _, imp := range tlRequest.Imp { - if err := processImp(&imp); err == nil { + if err := processImp(&imp, extra); err == nil { validImps = append(validImps, imp) } else { errs = append(errs, err) @@ -126,6 +147,9 @@ func (a *TripleliftAdapter) MakeBids(internalRequest *openrtb2.BidRequest, exter count := getBidCount(bidResp) bidResponse := adapters.NewBidderResponseWithBidsCapacity(count) + // Bids are always denominated in USD + bidResponse.Currency = "USD" + for _, sb := range bidResp.SeatBid { for i := 0; i < len(sb.Bid); i++ { bid := sb.Bid[i] diff --git a/adapters/triplelift/triplelift_currency_test.go b/adapters/triplelift/triplelift_currency_test.go new file mode 100644 index 0000000000..e82f8c46df --- /dev/null +++ b/adapters/triplelift/triplelift_currency_test.go @@ -0,0 +1,91 @@ +package triplelift + +import ( + "errors" + "testing" + + "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v4/adapters" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +type mockCurrencyConversion struct { + mock.Mock +} + +func (m *mockCurrencyConversion) GetRate(from, to string) (float64, error) { + args := m.Called(from, to) + return args.Get(0).(float64), args.Error(1) +} + +func (m *mockCurrencyConversion) GetRates() *map[string]map[string]float64 { + args := m.Called() + return args.Get(0).(*map[string]map[string]float64) +} + +var currencyTestCases = map[string]struct { + imp openrtb2.Imp + setMock func(m *mock.Mock) + expectedImp openrtb2.Imp + assertError assert.ErrorAssertionFunc +}{ + "no floor, no currency": { + imp: openrtb2.Imp{BidFloor: 0, BidFloorCur: ""}, + setMock: func(m *mock.Mock) {}, + expectedImp: openrtb2.Imp{BidFloor: 0, BidFloorCur: ""}, + assertError: assert.NoError, + }, + "floor, empty currency (implicit USD)": { + imp: openrtb2.Imp{BidFloor: 1.25, BidFloorCur: ""}, + setMock: func(m *mock.Mock) {}, + expectedImp: openrtb2.Imp{BidFloor: 1.25, BidFloorCur: "USD"}, + assertError: assert.NoError, + }, + "USD floor, no conversion needed": { + imp: openrtb2.Imp{BidFloor: 2.0, BidFloorCur: "USD"}, + setMock: func(m *mock.Mock) {}, + expectedImp: openrtb2.Imp{BidFloor: 2.0, BidFloorCur: "USD"}, + assertError: assert.NoError, + }, + "usd lowercase - no conversion needed": { + imp: openrtb2.Imp{BidFloor: 2.0, BidFloorCur: "usd"}, + setMock: func(m *mock.Mock) {}, + expectedImp: openrtb2.Imp{BidFloor: 2.0, BidFloorCur: "USD"}, + assertError: assert.NoError, + }, + "EUR floor converts to USD": { + imp: openrtb2.Imp{BidFloor: 1.0, BidFloorCur: "EUR"}, + setMock: func(m *mock.Mock) { + m.On("GetRate", "EUR", "USD").Return(1.1, nil) + }, + expectedImp: openrtb2.Imp{BidFloor: 1.1, BidFloorCur: "USD"}, + assertError: assert.NoError, + }, + "unknown currency returns error": { + imp: openrtb2.Imp{BidFloor: 1.0, BidFloorCur: "ABC"}, + setMock: func(m *mock.Mock) { + m.On("GetRate", "ABC", "USD").Return(0.0, errors.New("conversion rate not found")) + }, + expectedImp: openrtb2.Imp{BidFloor: 1.0, BidFloorCur: "ABC"}, + assertError: assert.Error, + }, +} + +func TestResolveBidFloorCurrency(t *testing.T) { + for name, tc := range currencyTestCases { + t.Run(name, func(t *testing.T) { + imp := tc.imp + mockConversions := &mockCurrencyConversion{} + tc.setMock(&mockConversions.Mock) + + reqInfo := adapters.ExtraRequestInfo{CurrencyConversions: mockConversions} + err := resolveBidFloorCurrency(&imp, &reqInfo) + + tc.assertError(t, err) + assert.Equal(t, tc.expectedImp.BidFloor, imp.BidFloor) + assert.Equal(t, tc.expectedImp.BidFloorCur, imp.BidFloorCur) + mockConversions.AssertExpectations(t) + }) + } +} diff --git a/adapters/triplelift/triplelifttest/exemplary/optional-params.json b/adapters/triplelift/triplelifttest/exemplary/optional-params.json index 33da6cb296..52e253ee37 100644 --- a/adapters/triplelift/triplelifttest/exemplary/optional-params.json +++ b/adapters/triplelift/triplelifttest/exemplary/optional-params.json @@ -48,6 +48,7 @@ }, "tagid": "foo", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "foo", diff --git a/adapters/triplelift/triplelifttest/exemplary/simple-banner-eur-floor.json b/adapters/triplelift/triplelifttest/exemplary/simple-banner-eur-floor.json new file mode 100644 index 0000000000..0415711292 --- /dev/null +++ b/adapters/triplelift/triplelifttest/exemplary/simple-banner-eur-floor.json @@ -0,0 +1,83 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "cur": ["USD"], + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{ "w": 300, "h": 250 }] + }, + "bidfloor": 1.0, + "bidfloorcur": "EUR", + "ext": { + "bidder": { "inventoryCode": "aa" } + } + } + ], + "ext": { + "prebid": { + "currency": { + "rates": { "EUR": { "USD": 1.1 } }, + "usepbsrates": false + } + } + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://tlx.3lift.net/s2s/auction?sra=1&supplier_id=20", + "body": { + "id": "test-request-id", + "cur": ["USD"], + "imp": [ + { + "id": "test-imp-id", + "banner": { "format": [{ "w": 300, "h": 250 }] }, + "bidfloor": 1.1, + "bidfloorcur": "USD", + "tagid": "aa", + "ext": { "bidder": { "inventoryCode": "aa" } } + } + ], + "ext": { + "prebid": { + "currency": { + "rates": { "EUR": { "USD": 1.1 } }, + "usepbsrates": false + } + } + } + }, + "impIDs": ["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [{ + "seat": "958", + "bid": [{ + "id": "b1", "impid": "test-imp-id", "price": 1.5, + "adm": "some-ad", "crid": "cr1", "w": 300, "h": 250, + "ext": { "triplelift_pb": { "format": 2 } } + }] + }], + "bidid": "auction-id" + } + } + } + ], + "expectedBidResponses": [{ + "currency": "USD", + "bids": [{ + "bid": { + "id": "b1", "impid": "test-imp-id", "price": 1.5, + "adm": "some-ad", "crid": "cr1", "w": 300, "h": 250, + "ext": { "triplelift_pb": { "format": 2 } } + }, + "type": "banner" + }] + }] +} diff --git a/adapters/triplelift/triplelifttest/exemplary/simple-video.json b/adapters/triplelift/triplelifttest/exemplary/simple-video.json index 8d63b9acf3..66f9eac6c5 100644 --- a/adapters/triplelift/triplelifttest/exemplary/simple-video.json +++ b/adapters/triplelift/triplelifttest/exemplary/simple-video.json @@ -40,6 +40,7 @@ { "tagid": "aaw", "bidfloor": 0.10, + "bidfloorcur": "USD", "id": "test-imp-id", "video": { "mimes": [ diff --git a/adapters/triplelift/triplelifttest/supplemental/video-format-11.json b/adapters/triplelift/triplelifttest/supplemental/video-format-11.json index 372cc51ea0..a1c631bf35 100644 --- a/adapters/triplelift/triplelifttest/supplemental/video-format-11.json +++ b/adapters/triplelift/triplelifttest/supplemental/video-format-11.json @@ -31,6 +31,7 @@ { "tagid": "aaw", "bidfloor": 0.10, + "bidfloorcur": "USD", "id": "test-imp-id", "video": { "mimes": [ "video/mp4"], diff --git a/adapters/triplelift/triplelifttest/supplemental/video-format-12.json b/adapters/triplelift/triplelifttest/supplemental/video-format-12.json index f2b55a0401..026dabbb14 100644 --- a/adapters/triplelift/triplelifttest/supplemental/video-format-12.json +++ b/adapters/triplelift/triplelifttest/supplemental/video-format-12.json @@ -31,6 +31,7 @@ { "tagid": "aaw", "bidfloor": 0.10, + "bidfloorcur": "USD", "id": "test-imp-id", "video": { "mimes": [ "video/mp4"], diff --git a/adapters/triplelift/triplelifttest/supplemental/video-format-17.json b/adapters/triplelift/triplelifttest/supplemental/video-format-17.json index 26dcc943af..f4a591cf40 100644 --- a/adapters/triplelift/triplelifttest/supplemental/video-format-17.json +++ b/adapters/triplelift/triplelifttest/supplemental/video-format-17.json @@ -31,6 +31,7 @@ { "tagid": "aaw", "bidfloor": 0.10, + "bidfloorcur": "USD", "id": "test-imp-id", "video": { "mimes": [ "video/mp4"], diff --git a/adapters/triplelift_native/triplelift_native.go b/adapters/triplelift_native/triplelift_native.go index 987e20d94b..59305b2327 100644 --- a/adapters/triplelift_native/triplelift_native.go +++ b/adapters/triplelift_native/triplelift_native.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v4/adapters" @@ -47,7 +48,7 @@ func getBidType(ext TripleliftRespExt) openrtb_ext.BidType { return openrtb_ext.BidTypeNative } -func processImp(imp *openrtb2.Imp, request *openrtb2.BidRequest) error { +func processImp(imp *openrtb2.Imp, request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) error { // get the triplelift extension var ext ExtImp var tlext openrtb_ext.ExtImpTriplelift @@ -68,15 +69,37 @@ func processImp(imp *openrtb2.Imp, request *openrtb2.BidRequest) error { imp.TagID = tlext.InvCode } - // floor is optional - if tlext.Floor == nil { - return nil + // floor is optional + if tlext.Floor != nil { + imp.BidFloor = *tlext.Floor + } + + // Normalize bid floor to USD + if err := resolveBidFloorCurrency(imp, reqInfo); err != nil { + return err } - imp.BidFloor = *tlext.Floor return nil } +// Normalize imp.BidFloor to USD +func resolveBidFloorCurrency(imp *openrtb2.Imp, reqInfo *adapters.ExtraRequestInfo) error { + if imp.BidFloor <= 0 { + return nil + } + if imp.BidFloorCur != "" && strings.ToUpper(imp.BidFloorCur) != "USD" { + converted, err := reqInfo.ConvertCurrency(imp.BidFloor, imp.BidFloorCur, "USD") + if err != nil { + return &errortypes.BadInput{ + Message: fmt.Sprintf("Unable to convert bid floor from %s to USD: %s", imp.BidFloorCur, err.Error()), + } + } + imp.BidFloor = converted + } + imp.BidFloorCur = "USD" + return nil +} + // msnInApp returns whether msn.com is in request.app.publisher.domain func msnInApp(request *openrtb2.BidRequest) bool { return request.App != nil && request.App.Publisher != nil && request.App.Publisher.Domain == "msn.com" @@ -113,7 +136,7 @@ func (a *TripleliftNativeAdapter) MakeRequests(request *openrtb2.BidRequest, ext var validImps []openrtb2.Imp // pre-process the imps for _, imp := range tlRequest.Imp { - if err := processImp(&imp, request); err == nil { + if err := processImp(&imp, request, extra); err == nil { validImps = append(validImps, imp) } else { errs = append(errs, err) @@ -186,6 +209,9 @@ func (a *TripleliftNativeAdapter) MakeBids(internalRequest *openrtb2.BidRequest, count := getBidCount(bidResp) bidResponse := adapters.NewBidderResponseWithBidsCapacity(count) + // Bids are always denominated in USD + bidResponse.Currency = "USD" + for _, sb := range bidResp.SeatBid { for i := 0; i < len(sb.Bid); i++ { bid := sb.Bid[i] diff --git a/adapters/triplelift_native/triplelift_native_currency_test.go b/adapters/triplelift_native/triplelift_native_currency_test.go new file mode 100644 index 0000000000..8a194bc9b1 --- /dev/null +++ b/adapters/triplelift_native/triplelift_native_currency_test.go @@ -0,0 +1,76 @@ +package triplelift_native + +import ( + "errors" + "testing" + + "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v4/adapters" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +type mockCurrencyConversion struct { + mock.Mock +} + +func (m *mockCurrencyConversion) GetRate(from, to string) (float64, error) { + args := m.Called(from, to) + return args.Get(0).(float64), args.Error(1) +} + +func (m *mockCurrencyConversion) GetRates() *map[string]map[string]float64 { + args := m.Called() + return args.Get(0).(*map[string]map[string]float64) +} + +func TestResolveBidFloorCurrency(t *testing.T) { + cases := map[string]struct { + imp openrtb2.Imp + setMock func(m *mock.Mock) + expectedImp openrtb2.Imp + assertError assert.ErrorAssertionFunc + }{ + "no floor": { + imp: openrtb2.Imp{BidFloor: 0, BidFloorCur: "EUR"}, + setMock: func(m *mock.Mock) {}, + expectedImp: openrtb2.Imp{BidFloor: 0, BidFloorCur: "EUR"}, + assertError: assert.NoError, + }, + "USD floor passthrough": { + imp: openrtb2.Imp{BidFloor: 3.0, BidFloorCur: "USD"}, + setMock: func(m *mock.Mock) {}, + expectedImp: openrtb2.Imp{BidFloor: 3.0, BidFloorCur: "USD"}, + assertError: assert.NoError, + }, + "EUR converts to USD": { + imp: openrtb2.Imp{BidFloor: 2.0, BidFloorCur: "EUR"}, + setMock: func(m *mock.Mock) { + m.On("GetRate", "EUR", "USD").Return(1.08, nil) + }, + expectedImp: openrtb2.Imp{BidFloor: 2.16, BidFloorCur: "USD"}, + assertError: assert.NoError, + }, + "conversion error": { + imp: openrtb2.Imp{BidFloor: 1.0, BidFloorCur: "XYZ"}, + setMock: func(m *mock.Mock) { + m.On("GetRate", "XYZ", "USD").Return(0.0, errors.New("rate not found")) + }, + expectedImp: openrtb2.Imp{BidFloor: 1.0, BidFloorCur: "XYZ"}, + assertError: assert.Error, + }, + } + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + imp := tc.imp + m := &mockCurrencyConversion{} + tc.setMock(&m.Mock) + reqInfo := adapters.ExtraRequestInfo{CurrencyConversions: m} + err := resolveBidFloorCurrency(&imp, &reqInfo) + tc.assertError(t, err) + assert.Equal(t, tc.expectedImp.BidFloor, imp.BidFloor) + assert.Equal(t, tc.expectedImp.BidFloorCur, imp.BidFloorCur) + m.AssertExpectations(t) + }) + } +} diff --git a/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn-no-tag-code.json b/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn-no-tag-code.json index 6950942f19..e6a91ded53 100644 --- a/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn-no-tag-code.json +++ b/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn-no-tag-code.json @@ -36,6 +36,7 @@ }, "tagid": "invcode", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn.json b/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn.json index 420cab5aff..570456c8bb 100644 --- a/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn.json +++ b/adapters/triplelift_native/triplelift_nativetest/exemplary/app-msn.json @@ -36,6 +36,7 @@ }, "tagid": "bar", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/exemplary/app.json b/adapters/triplelift_native/triplelift_nativetest/exemplary/app.json index d1cd72947b..c6a36ee0af 100644 --- a/adapters/triplelift_native/triplelift_nativetest/exemplary/app.json +++ b/adapters/triplelift_native/triplelift_nativetest/exemplary/app.json @@ -36,6 +36,7 @@ }, "tagid": "invcode", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn-no-tag-code.json b/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn-no-tag-code.json index 48162742a1..8ad19e9eef 100644 --- a/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn-no-tag-code.json +++ b/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn-no-tag-code.json @@ -36,6 +36,7 @@ }, "tagid": "invcode", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn.json b/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn.json index 5aaa5a1ddc..dbb1091f4f 100644 --- a/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn.json +++ b/adapters/triplelift_native/triplelift_nativetest/exemplary/site-msn.json @@ -36,6 +36,7 @@ }, "tagid": "bar", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/exemplary/site.json b/adapters/triplelift_native/triplelift_nativetest/exemplary/site.json index d273f4d411..a281ab34e4 100644 --- a/adapters/triplelift_native/triplelift_nativetest/exemplary/site.json +++ b/adapters/triplelift_native/triplelift_nativetest/exemplary/site.json @@ -36,6 +36,7 @@ }, "tagid": "invcode", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/supplemental/app-publisher-no-domain.json b/adapters/triplelift_native/triplelift_nativetest/supplemental/app-publisher-no-domain.json index ac119354c3..65e5cfe6df 100644 --- a/adapters/triplelift_native/triplelift_nativetest/supplemental/app-publisher-no-domain.json +++ b/adapters/triplelift_native/triplelift_nativetest/supplemental/app-publisher-no-domain.json @@ -34,6 +34,7 @@ }, "tagid": "invcode", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/supplemental/effective-publisher-allowed.json b/adapters/triplelift_native/triplelift_nativetest/supplemental/effective-publisher-allowed.json index 74ac929478..c5d3337d1a 100644 --- a/adapters/triplelift_native/triplelift_nativetest/supplemental/effective-publisher-allowed.json +++ b/adapters/triplelift_native/triplelift_nativetest/supplemental/effective-publisher-allowed.json @@ -41,6 +41,7 @@ }, "tagid": "invcode", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode", diff --git a/adapters/triplelift_native/triplelift_nativetest/supplemental/site-publisher-no-domain.json b/adapters/triplelift_native/triplelift_nativetest/supplemental/site-publisher-no-domain.json index d44ae442fa..2e3a4d0fa5 100644 --- a/adapters/triplelift_native/triplelift_nativetest/supplemental/site-publisher-no-domain.json +++ b/adapters/triplelift_native/triplelift_nativetest/supplemental/site-publisher-no-domain.json @@ -35,6 +35,7 @@ }, "tagid": "invcode", "bidfloor": 20, + "bidfloorcur": "USD", "ext": { "bidder": { "inventoryCode": "invcode",