diff --git a/docs/flows.md b/docs/flows.md index 1330ee3c0..e81f4693e 100644 --- a/docs/flows.md +++ b/docs/flows.md @@ -240,6 +240,7 @@ information. * 2002 * Command is not allowed in the current registry phase. * 2004 + * Unknown currency. * Domain label is not allowed by IDN table. * Domain name is under tld which doesn't exist. * 2005 @@ -311,6 +312,7 @@ An EPP flow that creates a new domain resource. * Registrant is required. * Technical contact is required. * 2004 + * Unknown currency. * The acceptance time specified in the claim notice is more than 48 hours in the past. * New registration period exceeds maximum number of years. @@ -421,6 +423,8 @@ information about the domain. ### Errors +* 2004 + * Unknown currency. * 2202 * Authorization information for accessing resource is invalid. * 2303 @@ -455,6 +459,7 @@ comes in at the exact millisecond that the domain would have expired. * Fees must be explicitly acknowledged when performing any operations on a premium name. * 2004 + * Unknown currency. * New registration period exceeds maximum number of years. * The fees passed in the transform command do not match the fees that will be charged. @@ -512,6 +517,7 @@ regardless of what the original expiration time was. * Fees must be explicitly acknowledged when performing any operations on a premium name. * 2004 + * Unknown currency. * The fees passed in the transform command do not match the fees that will be charged. * 2005 @@ -677,6 +683,7 @@ new ones with the correct approval time). * Fees must be explicitly acknowledged when performing any operations on a premium name. * 2004 + * Unknown currency. * The fees passed in the transform command do not match the fees that will be charged. * 2005 diff --git a/java/google/registry/flows/FlowUtils.java b/java/google/registry/flows/FlowUtils.java index 767688e08..0c18d0465 100644 --- a/java/google/registry/flows/FlowUtils.java +++ b/java/google/registry/flows/FlowUtils.java @@ -114,7 +114,7 @@ public final class FlowUtils { } /** Unknown currency. */ - static class UnknownCurrencyEppException extends ParameterValueRangeErrorException { + public static class UnknownCurrencyEppException extends ParameterValueRangeErrorException { public UnknownCurrencyEppException() { super("Unknown currency."); } diff --git a/java/google/registry/flows/domain/DomainCheckFlow.java b/java/google/registry/flows/domain/DomainCheckFlow.java index 6c011a8d7..fb909ebd6 100644 --- a/java/google/registry/flows/domain/DomainCheckFlow.java +++ b/java/google/registry/flows/domain/DomainCheckFlow.java @@ -77,6 +77,7 @@ import org.joda.time.DateTime; *

This flow also supports the EPP fee extension and can return pricing information. * * @error {@link google.registry.flows.exceptions.TooManyResourceChecksException} + * @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException} * @error {@link DomainFlowUtils.BadDomainNameCharacterException} * @error {@link DomainFlowUtils.BadDomainNamePartsCountException} * @error {@link DomainFlowUtils.DomainNameExistsAsTldException} diff --git a/java/google/registry/flows/domain/DomainCreateFlow.java b/java/google/registry/flows/domain/DomainCreateFlow.java index c65ce8275..eed6f1a06 100644 --- a/java/google/registry/flows/domain/DomainCreateFlow.java +++ b/java/google/registry/flows/domain/DomainCreateFlow.java @@ -123,6 +123,7 @@ import org.joda.time.Duration; * @error {@link google.registry.flows.exceptions.ResourceAlreadyExistsException} * @error {@link google.registry.flows.EppException.UnimplementedExtensionException} * @error {@link google.registry.flows.ExtensionManager.UndeclaredServiceExtensionException} + * @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException} * @error {@link DomainCreateFlow.AnchorTenantCreatePeriodException} * @error {@link DomainCreateFlow.MustHaveSignedMarksInCurrentPhaseException} * @error {@link DomainCreateFlow.NoGeneralRegistrationsInCurrentPhaseException} diff --git a/java/google/registry/flows/domain/DomainInfoFlow.java b/java/google/registry/flows/domain/DomainInfoFlow.java index a87b23dbb..ad7431071 100644 --- a/java/google/registry/flows/domain/DomainInfoFlow.java +++ b/java/google/registry/flows/domain/DomainInfoFlow.java @@ -63,6 +63,7 @@ import org.joda.time.DateTime; * domain, will get a rich result with all of the domain's fields. All other requests will be * answered with a minimal result containing only basic information about the domain. * + * @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException} * @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException} * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException} * @error {@link DomainFlowUtils.BadPeriodUnitException} diff --git a/java/google/registry/flows/domain/DomainRenewFlow.java b/java/google/registry/flows/domain/DomainRenewFlow.java index 37049b072..ffb580d93 100644 --- a/java/google/registry/flows/domain/DomainRenewFlow.java +++ b/java/google/registry/flows/domain/DomainRenewFlow.java @@ -92,6 +92,7 @@ import org.joda.time.Duration; * longer than 10 years unless it comes in at the exact millisecond that the domain would have * expired. * + * @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException} * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException} * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException} * @error {@link google.registry.flows.exceptions.ResourceStatusProhibitsOperationException} diff --git a/java/google/registry/flows/domain/DomainRestoreRequestFlow.java b/java/google/registry/flows/domain/DomainRestoreRequestFlow.java index 1dd507f4d..d2e4e951d 100644 --- a/java/google/registry/flows/domain/DomainRestoreRequestFlow.java +++ b/java/google/registry/flows/domain/DomainRestoreRequestFlow.java @@ -92,6 +92,7 @@ import org.joda.time.DateTime; * original expiration time was. * * @error {@link google.registry.flows.EppException.UnimplementedExtensionException} + * @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException} * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException} * @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException} * @error {@link DomainFlowUtils.CurrencyUnitMismatchException} diff --git a/java/google/registry/flows/domain/DomainTransferRequestFlow.java b/java/google/registry/flows/domain/DomainTransferRequestFlow.java index 1d01d1e78..3c728bd2e 100644 --- a/java/google/registry/flows/domain/DomainTransferRequestFlow.java +++ b/java/google/registry/flows/domain/DomainTransferRequestFlow.java @@ -92,6 +92,7 @@ import org.joda.time.DateTime; * rejection or cancellation of the request, they will be deleted (and in the approval case, * replaced with new ones with the correct approval time). * + * @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException} * @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException} * @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException} * @error {@link google.registry.flows.exceptions.AlreadyPendingTransferException} diff --git a/javatests/google/registry/flows/domain/DomainCheckFlowTest.java b/javatests/google/registry/flows/domain/DomainCheckFlowTest.java index 71615ac35..96872e1af 100644 --- a/javatests/google/registry/flows/domain/DomainCheckFlowTest.java +++ b/javatests/google/registry/flows/domain/DomainCheckFlowTest.java @@ -37,6 +37,7 @@ import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Ordering; import com.googlecode.objectify.Key; import google.registry.flows.EppException; +import google.registry.flows.FlowUtils.UnknownCurrencyEppException; import google.registry.flows.ResourceCheckFlowTestCase; import google.registry.flows.domain.DomainCheckFlow.OnlyCheckedNamesCanBeFeeCheckedException; import google.registry.flows.domain.DomainFlowUtils.BadCommandForRegistryPhaseException; @@ -417,7 +418,7 @@ public class DomainCheckFlowTest @Test public void testFeeExtension_v06() throws Exception { persistActiveDomain("example1.tld"); - setEppInput("domain_check_fee_v06.xml"); + setEppInput("domain_check_fee_v06.xml", ImmutableMap.of("CURRENCY", "USD")); runFlowAssertResponse(loadFile("domain_check_fee_response_v06.xml")); } @@ -430,7 +431,7 @@ public class DomainCheckFlowTest persistReservedList("example-sunrise", "allowedinsunrise,ALLOWED_IN_SUNRISE")) .build()); persistActiveDomain("example1.tld"); - setEppInput("domain_check_fee_v06.xml"); + setEppInput("domain_check_fee_v06.xml", ImmutableMap.of("CURRENCY", "USD")); runFlowAssertResponse(loadFile("domain_check_fee_response_v06.xml")); } @@ -726,6 +727,13 @@ public class DomainCheckFlowTest assertAboutEppExceptions().that(thrown).marshalsToXml(); } + @Test + public void testFeeExtension_badCurrencyType() { + setEppInput("domain_check_fee_v06.xml", ImmutableMap.of("CURRENCY", "BAD")); + EppException thrown = assertThrows(UnknownCurrencyEppException.class, this::runFlow); + assertAboutEppExceptions().that(thrown).marshalsToXml(); + } + @Test public void testFeeExtension_periodNotInYears_v06() { setEppInput("domain_check_fee_bad_period_v06.xml"); @@ -896,7 +904,7 @@ public class DomainCheckFlowTest .put(clock.nowUtc().plusDays(2), Money.of(USD, 0)) .build()) .build()); - setEppInput(inputFile); + setEppInput(inputFile, ImmutableMap.of("CURRENCY", "USD")); runFlowAssertResponse(loadFile(outputFile)); } diff --git a/javatests/google/registry/flows/domain/DomainCreateFlowTest.java b/javatests/google/registry/flows/domain/DomainCreateFlowTest.java index a0eb98895..32df35918 100644 --- a/javatests/google/registry/flows/domain/DomainCreateFlowTest.java +++ b/javatests/google/registry/flows/domain/DomainCreateFlowTest.java @@ -57,7 +57,6 @@ import static google.registry.tmch.LordnTaskUtils.QUEUE_CLAIMS; import static google.registry.tmch.LordnTaskUtils.QUEUE_SUNRISE; import static google.registry.util.DateTimeUtils.END_OF_TIME; import static google.registry.util.DateTimeUtils.START_OF_TIME; -import static org.joda.money.CurrencyUnit.EUR; import static org.joda.money.CurrencyUnit.USD; import com.google.common.base.Strings; @@ -71,6 +70,7 @@ import google.registry.flows.EppException; import google.registry.flows.EppException.UnimplementedExtensionException; import google.registry.flows.EppRequestSource; import google.registry.flows.ExtensionManager.UndeclaredServiceExtensionException; +import google.registry.flows.FlowUtils.UnknownCurrencyEppException; import google.registry.flows.ResourceFlowTestCase; import google.registry.flows.domain.DomainCreateFlow.AnchorTenantCreatePeriodException; import google.registry.flows.domain.DomainCreateFlow.MustHaveSignedMarksInCurrentPhaseException; @@ -154,7 +154,6 @@ import google.registry.model.reporting.HistoryEntry; import google.registry.monitoring.whitebox.EppMetric; import google.registry.testing.TaskQueueHelper.TaskMatcher; import java.util.Map; -import org.joda.money.CurrencyUnit; import org.joda.money.Money; import org.joda.time.DateTime; import org.joda.time.Duration; @@ -516,7 +515,7 @@ public class DomainCreateFlowTest extends ResourceFlowTestCase { private static final ImmutableMap FEE_06_MAP = - ImmutableMap.of("FEE_VERSION", "0.6", "FEE_NS", "fee"); + ImmutableMap.of("FEE_VERSION", "0.6", "FEE_NS", "fee", "CURRENCY", "USD"); private static final ImmutableMap FEE_11_MAP = - ImmutableMap.of("FEE_VERSION", "0.11", "FEE_NS", "fee11"); + ImmutableMap.of("FEE_VERSION", "0.11", "FEE_NS", "fee11", "CURRENCY", "USD"); private static final ImmutableMap FEE_12_MAP = - ImmutableMap.of("FEE_VERSION", "0.12", "FEE_NS", "fee12"); + ImmutableMap.of("FEE_VERSION", "0.12", "FEE_NS", "fee12", "CURRENCY", "USD"); final DateTime expirationTime = DateTime.parse("2000-04-03T22:00:00.0Z"); @@ -309,6 +310,15 @@ public class DomainRenewFlowTest extends ResourceFlowTestCase parameters = + ImmutableMap.of("FEE_VERSION", "0.6", "FEE_NS", "fee", "CURRENCY", "BAD"); + setEppInput("domain_renew_fee.xml", parameters); + EppException thrown = assertThrows(UnknownCurrencyEppException.class, this::persistDomain); + assertAboutEppExceptions().that(thrown).marshalsToXml(); + } + @Test public void testFailure_refundableFee_v06() throws Exception { setEppInput("domain_renew_fee_refundable.xml", FEE_06_MAP); diff --git a/javatests/google/registry/flows/domain/DomainRestoreRequestFlowTest.java b/javatests/google/registry/flows/domain/DomainRestoreRequestFlowTest.java index 35559b4b9..6f25a3c93 100644 --- a/javatests/google/registry/flows/domain/DomainRestoreRequestFlowTest.java +++ b/javatests/google/registry/flows/domain/DomainRestoreRequestFlowTest.java @@ -41,6 +41,7 @@ import com.google.common.collect.ImmutableSortedMap; import com.googlecode.objectify.Key; import google.registry.flows.EppException; import google.registry.flows.EppException.UnimplementedExtensionException; +import google.registry.flows.FlowUtils.UnknownCurrencyEppException; import google.registry.flows.ResourceFlowTestCase; import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException; import google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException; @@ -79,11 +80,11 @@ public class DomainRestoreRequestFlowTest extends ResourceFlowTestCase { private static final ImmutableMap FEE_06_MAP = - ImmutableMap.of("FEE_VERSION", "0.6", "FEE_NS", "fee"); + ImmutableMap.of("FEE_VERSION", "0.6", "FEE_NS", "fee", "CURRENCY", "USD"); private static final ImmutableMap FEE_11_MAP = - ImmutableMap.of("FEE_VERSION", "0.11", "FEE_NS", "fee11"); + ImmutableMap.of("FEE_VERSION", "0.11", "FEE_NS", "fee11", "CURRENCY", "USD"); private static final ImmutableMap FEE_12_MAP = - ImmutableMap.of("FEE_VERSION", "0.12", "FEE_NS", "fee12"); + ImmutableMap.of("FEE_VERSION", "0.12", "FEE_NS", "fee12", "CURRENCY", "USD"); @Before public void initDomainTest() { @@ -245,6 +246,16 @@ public class DomainRestoreRequestFlowTest runFlowAssertResponse(loadFile("domain_update_restore_request_response_fee.xml", FEE_12_MAP)); } + @Test + public void testFailure_fee_unknownCurrency() { + ImmutableMap substitutions = + ImmutableMap.of("FEE_VERSION", "0.12", "FEE_NS", "fee12", "CURRENCY", "BAD"); + setEppInput("domain_update_restore_request_fee.xml", substitutions); + EppException thrown = + assertThrows(UnknownCurrencyEppException.class, this::persistPendingDeleteDomain); + assertAboutEppExceptions().that(thrown).marshalsToXml(); + } + @Test public void testFailure_refundableFee_v06() throws Exception { setEppInput("domain_update_restore_request_fee_refundable.xml", FEE_06_MAP); diff --git a/javatests/google/registry/flows/domain/DomainTransferRequestFlowTest.java b/javatests/google/registry/flows/domain/DomainTransferRequestFlowTest.java index 590333c1f..b3927b5de 100644 --- a/javatests/google/registry/flows/domain/DomainTransferRequestFlowTest.java +++ b/javatests/google/registry/flows/domain/DomainTransferRequestFlowTest.java @@ -43,7 +43,6 @@ import static google.registry.testing.HostResourceSubject.assertAboutHosts; import static google.registry.testing.JUnitBackports.assertThrows; import static google.registry.testing.TaskQueueHelper.assertTasksEnqueued; import static google.registry.util.DateTimeUtils.START_OF_TIME; -import static org.joda.money.CurrencyUnit.EUR; import static org.joda.money.CurrencyUnit.USD; import static org.joda.time.Duration.standardSeconds; @@ -53,11 +52,13 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.collect.Streams; import com.googlecode.objectify.Key; import google.registry.flows.EppException; import google.registry.flows.EppRequestSource; +import google.registry.flows.FlowUtils.UnknownCurrencyEppException; import google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException; import google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException; import google.registry.flows.domain.DomainFlowUtils.BadPeriodUnitException; @@ -117,6 +118,7 @@ public class DomainTransferRequestFlowTest .put("DOMAIN", "example.tld") .put("YEARS", "1") .put("AMOUNT", "11.00") + .put("CURRENCY", "USD") .build(); private static final ImmutableMap FEE_06_MAP = new ImmutableMap.Builder() @@ -136,6 +138,15 @@ public class DomainTransferRequestFlowTest .put("FEE_VERSION", "0.12") .put("FEE_NS", "fee12") .build(); + private static final ImmutableMap RICH_DOMAIN_MAP = + ImmutableMap.builder() + .put("DOMAIN", "rich.example") + .put("YEARS", "1") + .put("AMOUNT", "100.00") + .put("CURRENCY", "USD") + .put("FEE_VERSION", "0.12") + .put("FEE_NS", "fee12") + .build(); @Before public void setUp() { @@ -1152,15 +1163,7 @@ public class DomainTransferRequestFlowTest setupDomain("rich", "example"); clock.advanceOneMilli(); // We don't verify the results; just check that the flow doesn't fail. - runTest( - "domain_transfer_request_fee.xml", - UserPrivileges.NORMAL, - ImmutableMap.of( - "DOMAIN", "rich.example", - "YEARS", "1", - "AMOUNT", "100.00", - "FEE_VERSION", "0.12", - "FEE_NS", "fee12")); + runTest("domain_transfer_request_fee.xml", UserPrivileges.NORMAL, RICH_DOMAIN_MAP); } @Test @@ -1170,33 +1173,18 @@ public class DomainTransferRequestFlowTest // Modify the Registrar to block premium names. persistResource(loadRegistrar("NewRegistrar").asBuilder().setBlockPremiumNames(true).build()); // We don't verify the results; just check that the flow doesn't fail. - runTest( - "domain_transfer_request_fee.xml", - UserPrivileges.SUPERUSER, - ImmutableMap.of( - "DOMAIN", "rich.example", - "YEARS", "1", - "AMOUNT", "100.00", - "FEE_VERSION", "0.12", - "FEE_NS", "fee12")); + runTest("domain_transfer_request_fee.xml", UserPrivileges.SUPERUSER, RICH_DOMAIN_MAP); } private void runWrongCurrencyTest(Map substitutions) { + Map fullSubstitutions = Maps.newHashMap(); + fullSubstitutions.putAll(substitutions); + fullSubstitutions.put("CURRENCY", "EUR"); setupDomain("example", "tld"); - persistResource( - Registry.get("tld") - .asBuilder() - .setCurrency(EUR) - .setCreateBillingCost(Money.of(EUR, 13)) - .setRestoreBillingCost(Money.of(EUR, 11)) - .setRenewBillingCostTransitions(ImmutableSortedMap.of(START_OF_TIME, Money.of(EUR, 7))) - .setEapFeeSchedule(ImmutableSortedMap.of(START_OF_TIME, Money.zero(EUR))) - .setServerStatusChangeBillingCost(Money.of(EUR, 19)) - .build()); EppException thrown = assertThrows( CurrencyUnitMismatchException.class, - () -> doFailingTest("domain_transfer_request_fee.xml", substitutions)); + () -> doFailingTest("domain_transfer_request_fee.xml", fullSubstitutions)); assertAboutEppExceptions().that(thrown).marshalsToXml(); } @@ -1215,6 +1203,17 @@ public class DomainTransferRequestFlowTest runWrongCurrencyTest(FEE_12_MAP); } + @Test + public void testFailure_unknownCurrency() { + Map substitutions = Maps.newHashMap(); + substitutions.putAll(FEE_06_MAP); + substitutions.put("CURRENCY", "BAD"); + setupDomain("example", "tld"); + setEppInput("domain_transfer_request_fee.xml", substitutions); + EppException thrown = assertThrows(UnknownCurrencyEppException.class, this::runFlow); + assertAboutEppExceptions().that(thrown).marshalsToXml(); + } + @Test public void testFailure_feeGivenInWrongScale_v06() { setupDomain("example", "tld"); diff --git a/javatests/google/registry/flows/domain/testdata/domain_check_fee_v06.xml b/javatests/google/registry/flows/domain/testdata/domain_check_fee_v06.xml index 4c019069a..39e525f5f 100644 --- a/javatests/google/registry/flows/domain/testdata/domain_check_fee_v06.xml +++ b/javatests/google/registry/flows/domain/testdata/domain_check_fee_v06.xml @@ -14,13 +14,13 @@ example2.tld - USD + %CURRENCY% create 1 example3.tld - USD + %CURRENCY% create 2 diff --git a/javatests/google/registry/flows/domain/testdata/domain_create_fee.xml b/javatests/google/registry/flows/domain/testdata/domain_create_fee.xml index 184d6596b..3401c1091 100644 --- a/javatests/google/registry/flows/domain/testdata/domain_create_fee.xml +++ b/javatests/google/registry/flows/domain/testdata/domain_create_fee.xml @@ -19,7 +19,7 @@ - USD + %CURRENCY% 26.00 diff --git a/javatests/google/registry/flows/domain/testdata/domain_info_fee_create.xml b/javatests/google/registry/flows/domain/testdata/domain_info_fee_create.xml index cee6bb5e0..4887691aa 100644 --- a/javatests/google/registry/flows/domain/testdata/domain_info_fee_create.xml +++ b/javatests/google/registry/flows/domain/testdata/domain_info_fee_create.xml @@ -8,7 +8,7 @@ - USD + %CURRENCY% create 2 diff --git a/javatests/google/registry/flows/domain/testdata/domain_info_fee_create_euro.xml b/javatests/google/registry/flows/domain/testdata/domain_info_fee_create_euro.xml deleted file mode 100644 index 05f354501..000000000 --- a/javatests/google/registry/flows/domain/testdata/domain_info_fee_create_euro.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - example.tld - - - - - EUR - create - 2 - - - ABC-12345 - - diff --git a/javatests/google/registry/flows/domain/testdata/domain_renew_fee.xml b/javatests/google/registry/flows/domain/testdata/domain_renew_fee.xml index fc8ee2cb2..2e06318e0 100644 --- a/javatests/google/registry/flows/domain/testdata/domain_renew_fee.xml +++ b/javatests/google/registry/flows/domain/testdata/domain_renew_fee.xml @@ -10,7 +10,7 @@ - USD + %CURRENCY% 55.00 diff --git a/javatests/google/registry/flows/domain/testdata/domain_transfer_request_fee.xml b/javatests/google/registry/flows/domain/testdata/domain_transfer_request_fee.xml index c4192a49d..5fc8d376e 100644 --- a/javatests/google/registry/flows/domain/testdata/domain_transfer_request_fee.xml +++ b/javatests/google/registry/flows/domain/testdata/domain_transfer_request_fee.xml @@ -12,7 +12,7 @@ - USD + %CURRENCY% %AMOUNT% diff --git a/javatests/google/registry/flows/domain/testdata/domain_update_restore_request_fee.xml b/javatests/google/registry/flows/domain/testdata/domain_update_restore_request_fee.xml index 1952a09af..23e4cc7d7 100644 --- a/javatests/google/registry/flows/domain/testdata/domain_update_restore_request_fee.xml +++ b/javatests/google/registry/flows/domain/testdata/domain_update_restore_request_fee.xml @@ -12,7 +12,7 @@ - USD + %CURRENCY% 17.00 11.00