Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace hardfork_at with eras object, and add node_era #2468

Merged
merged 6 commits into from
Jan 28, 2021

Conversation

Anviking
Copy link
Collaborator

@Anviking Anviking commented Jan 26, 2021

Issue Number

ADP-676, ADP-681

Overview

  • Instead of storing ProtocolParameters in DB, just keep them in a TVar

  • Remove problem where the wallet might use genesis-derived protocol parameters and era on wallet start up, until the node first changed tip.

  • Replace hardfork_at with info of all eras

  • Add new node_era field in GET /network/information

  • See if we can order the eras correctly in the era object (for when the JSON is viewed by humans) Seems impossible to do.

Comments

  • Could add absolute slot field also
  • Arguably a bit sad that the eras get sorted seemingly alphabetically in the json
$ cardano-wallet network parameters
{
    "slot_length": {
        "quantity": 1,
        "unit": "second"
    },
    "decentralization_level": {
        "quantity": 74,
        "unit": "percent"
    },
    "genesis_block_hash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb",
    "blockchain_start_time": "2017-09-23T21:44:51Z",
    "desired_pool_number": 500,
    "epoch_length": {
        "quantity": 432000,
        "unit": "slot"
    },
    "eras": {
        "shelley": {
            "epoch_start_time": "2020-07-29T21:44:51Z",
            "epoch_number": 208
        },
        "mary": null,
        "byron": {
            "epoch_start_time": "2017-09-23T21:44:51Z",
            "epoch_number": 0
        },
        "allegra": {
            "epoch_start_time": "2020-12-16T21:44:51Z",
            "epoch_number": 236
        }
    },
    "active_slot_coefficient": {
        "quantity": 5,
        "unit": "percent"
    },
    "security_parameter": {
        "quantity": 2160,
        "unit": "block"
    },
    "minimum_utxo_value": {
        "quantity": 1000000,
        "unit": "lovelace"
    }
}

@Anviking Anviking added the IMPROVEMENT Mark a PR as an improvement, for auto-generated CHANGELOG label Jan 26, 2021
@Anviking Anviking self-assigned this Jan 26, 2021
@Anviking Anviking marked this pull request as draft January 26, 2021 15:08
@Anviking Anviking changed the title Replace hardfork_at with info of all eras Replace hardfork_at with eras object Jan 26, 2021
@Anviking Anviking changed the title Replace hardfork_at with eras object Replace hardfork_at with eras object Jan 26, 2021
@@ -2190,6 +2190,11 @@ taggedSumTypeOptions base opts = base
{ sumEncoding = TaggedObject (_tagFieldName opts) (_contentsFieldName opts)
}

explicitNothingRecordTypeOptions :: Aeson.Options
explicitNothingRecordTypeOptions = defaultRecordTypeOptions
{ omitNothingFields = False
Copy link
Collaborator Author

@Anviking Anviking Jan 26, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure why this is enabled by default…

"Is the mary key not present because the wallet is not supporting mary, or because the mary fork has not yet occurred?"

Explicit null for the latter case seems much clearer.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the absence of a field doesn't have the same meaning as a null value. I think that in the context of our API indeed, we most likely always want fields corresponding to Maybe values to be present 🤔

@@ -51,7 +51,8 @@ spec = describe "SHELLEY_NETWORK" $ do
[ expectField #decentralizationLevel (`shouldBe` d)
, expectField #desiredPoolNumber (`shouldBe` nOpt)
, expectField #minimumUtxoValue (`shouldBe` Quantity minUTxOValue)
, expectField #hardforkAt (`shouldNotBe` Nothing)
, expectField (#eras . #shelley) (`shouldNotBe` Nothing)
, expectField (#eras . #byron) (`shouldNotBe` Nothing)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Integration tests can in practice be run on any shelley-based era. So simply testing that at least byron and shelley are not null, should be pretty good.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but then you will not receive information about mary and allegra, right? 🤔

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, fine, we can probably make the expectation dependent on the LOCAL_CLUSTER_ERA value, by storing it in the test Context

Copy link
Collaborator Author

@Anviking Anviking Jan 27, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, seems unexpectedly tedious though… (Can't use a shelley type in cardano-wallet-core-integration) Will look more at it later.

Comment on lines +1431 to +1440
If and when each era started or will start.

The object is keyed by era names. The values either describe the epoch boundary
when the era starts (can be in the future or in the past), or are null if not yet
confirmed on-chain.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because of

(can be in the future or in the past)

wouldn't it make sense to provide a era field either here, or in /network/information?

A non-null mary does not necessarily mean that we're in Mary. We could also be just before Mary.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought it would go like this : we know something like mary will happen (null), then we know when it happens (by specifying era it starts), and we also now current slot/era. So everything is fine;-)

@@ -749,15 +751,30 @@ data ApiNetworkParameters = ApiNetworkParameters
, decentralizationLevel :: !(Quantity "percent" Percentage)
, desiredPoolNumber :: !Word16
, minimumUtxoValue :: !(Quantity "lovelace" Natural)
, hardforkAt :: !(Maybe ApiEpochInfo)
, eras :: !ApiEraInfo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not to have

eras: [ApiEraInfo]
...
data Eras = Byron | Shelley | Allegra | Mary deriving (Eq, Ord, Show)

data ApiEraInfo = ApiEraInfo {
   hardForkToEra :: !Era
   hardFromEra :: !(Maybe Era)
   timeOfTransition:: !(Maybe ApiEpochInfo)
}

?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it is more robust in a sense that when new hard forks arrive they will just add new element to list. But maybe there is some rationale behind this way of storing era transitions?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@KtorZ advocated for an object keyed by era-name since Daedalus wants to do stuff like isAllegra and isShelley, and already have to be highly aware of e.g. the ordering of them.

Although with #2468 (comment) in mind, I wonder if this changes 🤔

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems we should indeed add some kind of currentEra field somewhere.

Maybe we should make this a list then, yes 🤔

Off the top of my head I would probably just do

data ApiEraInfo = ApiEraInfo {
   eraName :: !Era
   start :: !(Maybe ApiEpochInfo)
}

since hardFromEra doesn't provide any extra information.

Copy link
Collaborator Author

@Anviking Anviking Jan 28, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In-doubt I would stick to the current object format. I think it still has its qualities too. If you feel strongly about it, feel free to disagree.

But I imagine, if a need arises where a list would be great for Daedalus, we can change it then. Currently the need for this is unclear.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you got me wrong Johannes. I like your proposal, just was thinking loudly and sharing some ideas ;-) no pun intended.great job!

-- It might be cumbersome to work with this type. /But/ we don't need to. A
-- product of @Maybe@ is both what we can query from the node, and
-- what we need to provide in the wallet API.
data EraInfo info = EraInfo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you opt for my suggestion of ApiEraInfo then this part should also comply

_ ->
LSQry $ QueryAnytimeMary GetEraStart
eraBounds <- W.EraInfo
<$> LSQry (QueryAnytimeByron GetEraStart)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

<<: *epochInfo
nullable: True

ApiEraInfo: &ApiEraInfo
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the same here in case ApiEraInfo is refactored

Copy link
Member

@KtorZ KtorZ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, provided that we make sure of the behavior on start-up with regards to protocol parameters. I'd expect the server to block on a particular request until protocol parameters become available.

@@ -51,7 +51,8 @@ spec = describe "SHELLEY_NETWORK" $ do
[ expectField #decentralizationLevel (`shouldBe` d)
, expectField #desiredPoolNumber (`shouldBe` nOpt)
, expectField #minimumUtxoValue (`shouldBe` Quantity minUTxOValue)
, expectField #hardforkAt (`shouldNotBe` Nothing)
, expectField (#eras . #shelley) (`shouldNotBe` Nothing)
, expectField (#eras . #byron) (`shouldNotBe` Nothing)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@@ -2190,6 +2190,11 @@ taggedSumTypeOptions base opts = base
{ sumEncoding = TaggedObject (_tagFieldName opts) (_contentsFieldName opts)
}

explicitNothingRecordTypeOptions :: Aeson.Options
explicitNothingRecordTypeOptions = defaultRecordTypeOptions
{ omitNothingFields = False
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that the absence of a field doesn't have the same meaning as a null value. I think that in the context of our API indeed, we most likely always want fields corresponding to Maybe values to be present 🤔

"epoch_start_time": "1891-03-26T08:00:00Z",
"epoch_number": 53
},
"byron": null,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That would be problematic in practice :)

@Anviking Anviking force-pushed the anviking/ADP-623/era-info branch 2 times, most recently from ae508e2 to c7c5b7a Compare January 27, 2021 17:50
@Anviking Anviking marked this pull request as ready for review January 28, 2021 10:00
@Anviking
Copy link
Collaborator Author

bors r+

iohk-bors bot added a commit that referenced this pull request Jan 28, 2021
2468: Replace `hardfork_at` with `eras` object r=Anviking a=Anviking

# Issue Number

ADP-676


# Overview

<!-- Detail in a few bullet points the work accomplished in this PR -->

- [x] Replace `hardfork_at` with info of all eras
- [x] Instead of storing ProtocolParameters in DB, just keep them in a `TVar`
- [ ] <s>See if we can order the eras correctly in the `era` object (for when the JSON is viewed by humans)</s> Seems impossible to do.
- [x] TODO: Extend swagger
- [ ] Tiny doc tweaks

# Comments

- Could add absolute `slot` field also
- Arguably a bit sad that the eras get sorted seemingly alphabetically in the json

```json
$ cardano-wallet network parameters
{
    "slot_length": {
        "quantity": 1,
        "unit": "second"
    },
    "decentralization_level": {
        "quantity": 74,
        "unit": "percent"
    },
    "genesis_block_hash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb",
    "blockchain_start_time": "2017-09-23T21:44:51Z",
    "desired_pool_number": 500,
    "epoch_length": {
        "quantity": 432000,
        "unit": "slot"
    },
    "eras": {
        "shelley": {
            "epoch_start_time": "2020-07-29T21:44:51Z",
            "epoch_number": 208
        },
        "mary": null,
        "byron": {
            "epoch_start_time": "2017-09-23T21:44:51Z",
            "epoch_number": 0
        },
        "allegra": {
            "epoch_start_time": "2020-12-16T21:44:51Z",
            "epoch_number": 236
        }
    },
    "active_slot_coefficient": {
        "quantity": 5,
        "unit": "percent"
    },
    "security_parameter": {
        "quantity": 2160,
        "unit": "block"
    },
    "minimum_utxo_value": {
        "quantity": 1000000,
        "unit": "lovelace"
    }
}
```

<!-- Additional comments or screenshots to attach if any -->

<!--
Don't forget to:

 ✓ Self-review your changes to make sure nothing unexpected slipped through
 ✓ Assign yourself to the PR
 ✓ Assign one or several reviewer(s)
 ✓ Jira will detect and link to this PR once created, but you can also link this PR in the description of the corresponding ticket
 ✓ Acknowledge any changes required to the Wiki
 ✓ Finally, in the PR description delete any empty sections and all text commented in <!--, so that this text does not appear in merge commit messages.
-->


Co-authored-by: Johannes Lund <johannes.lund@iohk.io>
@Anviking Anviking changed the title Replace hardfork_at with eras object Replace hardfork_at with eras object, and add node_era Jan 28, 2021
@iohk-bors
Copy link
Contributor

iohk-bors bot commented Jan 28, 2021

Build failed:

#expected

We never want to use the old genesis parameters just because the wallet
just started.

The onTipUpdate will be run immediately on startup, and will fetch
both interpreter, and protocol parameters.

To be safe, and for readability, let's replace the TVar+initial val with
an empty TMVar though.
@Anviking
Copy link
Collaborator Author

bors r+

iohk-bors bot added a commit that referenced this pull request Jan 28, 2021
2468: Replace `hardfork_at` with `eras` object, and add node_era r=Anviking a=Anviking

# Issue Number

ADP-676


# Overview

<!-- Detail in a few bullet points the work accomplished in this PR -->

- [x] Replace `hardfork_at` with info of all eras
- [x] Instead of storing ProtocolParameters in DB, just keep them in a `TVar`
- [ ] <s>See if we can order the eras correctly in the `era` object (for when the JSON is viewed by humans)</s> Seems impossible to do.
- [x] TODO: Extend swagger
- [ ] Tiny doc tweaks

# Comments

- Could add absolute `slot` field also
- Arguably a bit sad that the eras get sorted seemingly alphabetically in the json

```json
$ cardano-wallet network parameters
{
    "slot_length": {
        "quantity": 1,
        "unit": "second"
    },
    "decentralization_level": {
        "quantity": 74,
        "unit": "percent"
    },
    "genesis_block_hash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb",
    "blockchain_start_time": "2017-09-23T21:44:51Z",
    "desired_pool_number": 500,
    "epoch_length": {
        "quantity": 432000,
        "unit": "slot"
    },
    "eras": {
        "shelley": {
            "epoch_start_time": "2020-07-29T21:44:51Z",
            "epoch_number": 208
        },
        "mary": null,
        "byron": {
            "epoch_start_time": "2017-09-23T21:44:51Z",
            "epoch_number": 0
        },
        "allegra": {
            "epoch_start_time": "2020-12-16T21:44:51Z",
            "epoch_number": 236
        }
    },
    "active_slot_coefficient": {
        "quantity": 5,
        "unit": "percent"
    },
    "security_parameter": {
        "quantity": 2160,
        "unit": "block"
    },
    "minimum_utxo_value": {
        "quantity": 1000000,
        "unit": "lovelace"
    }
}
```

<!-- Additional comments or screenshots to attach if any -->

<!--
Don't forget to:

 ✓ Self-review your changes to make sure nothing unexpected slipped through
 ✓ Assign yourself to the PR
 ✓ Assign one or several reviewer(s)
 ✓ Jira will detect and link to this PR once created, but you can also link this PR in the description of the corresponding ticket
 ✓ Acknowledge any changes required to the Wiki
 ✓ Finally, in the PR description delete any empty sections and all text commented in <!--, so that this text does not appear in merge commit messages.
-->


Co-authored-by: Johannes Lund <johannes.lund@iohk.io>
@iohk-bors
Copy link
Contributor

iohk-bors bot commented Jan 28, 2021

Build failed:

  rollback
      Can rollback to any arbitrary known checkpoint
        +++ OK, passed 100 tests.
      Correctly re-construct tx history on rollbacks
        +++ OK, passed 800 tests:
        58.4% rolling back something

        41.6% Outgoing tx after point: 0
building of '/nix/store/9yv02wjfqrsrlznkh1affmp2xwh1jr4s-cardano-wallet-core-test-unit-2021.1.12-check' timed out after 900 seconds of silence

Probably related to
#2393
but a timeout

@Anviking
Copy link
Collaborator Author

bors r+

iohk-bors bot added a commit that referenced this pull request Jan 28, 2021
2468: Replace `hardfork_at` with `eras` object, and add node_era r=Anviking a=Anviking

# Issue Number

ADP-676


# Overview

<!-- Detail in a few bullet points the work accomplished in this PR -->

- [x] Replace `hardfork_at` with info of all eras
- [x] Instead of storing ProtocolParameters in DB, just keep them in a `TVar`
- [ ] <s>See if we can order the eras correctly in the `era` object (for when the JSON is viewed by humans)</s> Seems impossible to do.
- [x] TODO: Extend swagger
- [ ] Tiny doc tweaks

# Comments

- Could add absolute `slot` field also
- Arguably a bit sad that the eras get sorted seemingly alphabetically in the json

```json
$ cardano-wallet network parameters
{
    "slot_length": {
        "quantity": 1,
        "unit": "second"
    },
    "decentralization_level": {
        "quantity": 74,
        "unit": "percent"
    },
    "genesis_block_hash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb",
    "blockchain_start_time": "2017-09-23T21:44:51Z",
    "desired_pool_number": 500,
    "epoch_length": {
        "quantity": 432000,
        "unit": "slot"
    },
    "eras": {
        "shelley": {
            "epoch_start_time": "2020-07-29T21:44:51Z",
            "epoch_number": 208
        },
        "mary": null,
        "byron": {
            "epoch_start_time": "2017-09-23T21:44:51Z",
            "epoch_number": 0
        },
        "allegra": {
            "epoch_start_time": "2020-12-16T21:44:51Z",
            "epoch_number": 236
        }
    },
    "active_slot_coefficient": {
        "quantity": 5,
        "unit": "percent"
    },
    "security_parameter": {
        "quantity": 2160,
        "unit": "block"
    },
    "minimum_utxo_value": {
        "quantity": 1000000,
        "unit": "lovelace"
    }
}
```

<!-- Additional comments or screenshots to attach if any -->

<!--
Don't forget to:

 ✓ Self-review your changes to make sure nothing unexpected slipped through
 ✓ Assign yourself to the PR
 ✓ Assign one or several reviewer(s)
 ✓ Jira will detect and link to this PR once created, but you can also link this PR in the description of the corresponding ticket
 ✓ Acknowledge any changes required to the Wiki
 ✓ Finally, in the PR description delete any empty sections and all text commented in <!--, so that this text does not appear in merge commit messages.
-->


Co-authored-by: Johannes Lund <johannes.lund@iohk.io>
@iohk-bors
Copy link
Contributor

iohk-bors bot commented Jan 28, 2021

Build failed:

Failures:
--
  |  
  | src/Test/Integration/Framework/DSL.hs:780:11:
  | 1) API Specifications, SHELLEY_STAKE_POOLS, STAKE_POOLS_JOIN_01rewards - Can join a pool, earn rewards and collect them
  | Quantity {getQuantity = 0} does not satisfy (> Quantity {getQuantity = 0})
  | While verifying (Status {statusCode = 200, statusMessage = "OK"},Right (ApiWallet {id = ApiT {getApiT = WalletId {getWalletId = c83c7e41054d4f96238c00e1a8abf75c7a93f485}}, addressPoolGap = ApiT {getApiT = AddressPoolGap {getAddressPoolGap = 20}}, balance = ApiWalletBalance {available = Quantity {getQuantity = 999998856100}, total = Quantity {getQuantity = 999998856100}, reward = Quantity {getQuantity = 0}}, assets = ApiWalletAssetsBalance {available = ApiT {getApiT = TokenMap (fromList [])}, total = ApiT {getApiT = TokenMap (fromList [])}}, delegation = ApiWalletDelegation {active = ApiWalletDelegationNext {status = Delegating, target = Just (ApiT {getApiT = PoolId {getPoolId = "\ESC=\193\156j\184\158\175\252\133\SOH\243u\187\ETX\193\ESC\248\237]\CAN76\177\216\EOT\DC3\214"}}), changesAt = Nothing}, next = []}, name = ApiT {getApiT = WalletName {getWalletName = "Faucet Wallet"}}, passphrase = Just (ApiWalletPassphraseInfo {lastUpdatedAt = 2021-01-28 13:02:28.321281775 UTC}), state = ApiT {getApiT = Ready}, tip = ApiBlockReference {absoluteSlotNumber = ApiT {getApiT = SlotNo 3749}, slotId = ApiSlotId {epochNumber = ApiT {getApiT = EpochNo {unEpochNo = 74}}, slotNumber = ApiT {getApiT = SlotInEpoch {unSlotInEpoch = 49}}}, time = 2021-01-28 13:04:17.8 UTC, block = ApiBlockInfo {height = Quantity {getQuantity = 1300}}}}))
  | Waited longer than 90s to resolve action: "Wallet gets rewards".
  |  
  | To rerun use: --match "/API Specifications/SHELLEY_STAKE_POOLS/STAKE_POOLS_JOIN_01rewards - Can join a pool, earn rewards and collect them/"
  |  
  | src/Test/Integration/Framework/DSL.hs:780:11:
  | 2) API Specifications, SHELLEY_STAKE_POOLS, STAKE_POOLS_JOIN_04 - Rewards accumulate
  | Quantity {getQuantity = 0} does not satisfy (> Quantity {getQuantity = 0})
  | While verifying (Status {statusCode = 200, statusMessage = "OK"},Right (ApiWallet {id = ApiT {getApiT = WalletId {getWalletId = 27d366bd6cfe862494c2678f82d2613fd6fa8c42}}, addressPoolGap = ApiT {getApiT = AddressPoolGap {getAddressPoolGap = 20}}, balance = ApiWalletBalance {available = Quantity {getQuantity = 999998856100}, total = Quantity {getQuantity = 999998856100}, reward = Quantity {getQuantity = 0}}, assets = ApiWalletAssetsBalance {available = ApiT {getApiT = TokenMap (fromList [])}, total = ApiT {getApiT = TokenMap (fromList [])}}, delegation = ApiWalletDelegation {active = ApiWalletDelegationNext {status = Delegating, target = Just (ApiT {getApiT = PoolId {getPoolId = "\ESC=\193\156j\184\158\175\252\133\SOH\243u\187\ETX\193\ESC\248\237]\CAN76\177\216\EOT\DC3\214"}}), changesAt = Nothing}, next = []}, name = ApiT {getApiT = WalletName {getWalletName = "Faucet Wallet"}}, passphrase = Just (ApiWalletPassphraseInfo {lastUpdatedAt = 2021-01-28 13:02:43.016598676 UTC}), state = ApiT {getApiT = Ready}, tip = ApiBlockReference {absoluteSlotNumber = ApiT {getApiT = SlotNo 3797}, slotId = ApiSlotId {epochNumber = ApiT {getApiT = EpochNo {unEpochNo = 75}}, slotNumber = ApiT {getApiT = SlotInEpoch {unSlotInEpoch = 47}}}, time = 2021-01-28 13:04:27.4 UTC, block = ApiBlockInfo {height = Quantity {getQuantity = 1320}}}}))
  | Waited longer than 90s to resolve action: "Wallet gets rewards".
  |  
  | To rerun use: --match "/API Specifications/SHELLEY_STAKE_POOLS/STAKE_POOLS_JOIN_04 - Rewards accumulate/"
  |  
  | src/Test/Integration/Framework/DSL.hs:780:11:
  | 3) API Specifications, SHELLEY_STAKE_POOLS, STAKE_POOLS_LIST_01 - List stake pools, has non-zero saturation & stake
  | Quantity {getQuantity = Percentage {getPercentage = 0 % 1}} does not satisfy (> Quantity {getQuantity = Percentage {getPercentage = 0 % 1}})
  | While verifying (Status {statusCode = 200, statusMessage = "OK"},Right [ApiStakePool {id = ApiT {getApiT = PoolId {getPoolId = "\ESC=\193\156j\184\158\175\252\133\SOH\243u\187\ETX\193\ESC\248\237]\CAN76\177\216\EOT\DC3\214"}}, metrics = ApiStakePoolMetrics {nonMyopicMemberRewards = Quantity {getQuantity = 906097506287}, relativeStake = Quantity {getQuantity = Percentage {getPercentage = 0 % 1}}, saturation = 1.464843767327409e-5, producedBlocks = Quantity {getQuantity = 4}}, metadata = Nothing, cost = Quantity {getQuantity = 0}, margin = Quantity {getQuantity = Percentage {getPercentage = 1 % 10}}, pledge = Quantity {getQuantity = 2000000000000}, retirement = Nothing, flags = []},ApiStakePool {id = ApiT {getApiT = PoolId {getPoolId = "\187\DC1L\179}u\250\ENQ&\ETX(\194\&5\163\218\226\149\163=\v\166t\165\235\RS>V\142"}}, metrics = ApiStakePoolMetrics {nonMyopicMemberRewards = Quantity {getQuantity = 699331380211}, relativeStake = Quantity {getQuantity = Percentage {getPercentage = 417 % 1000}}, saturation = 1.2510032213152051, producedBlocks = Quantity {getQuantity = 739}}, metadata = Nothing, cost = Quantity {getQuantity = 0}, margin = Quantity {getQuantity = Percentage {getPercentage = 1 % 10}}, pledge = Quantity {getQuantity = 1000000000000}, retirement = Just (ApiEpochInfo {epochNumber = ApiT {getApiT = EpochNo {unEpochNo = 1000000}}, epochStartTime = 2021-05-24 06:38:28 UTC}), flags = []},ApiStakePool {id = ApiT {getApiT = PoolId {getPoolId = "\180Wh\193\162\218K\209>\188\170\RS\165\DC4\b\237\163\GS\204!v\\\203\212\a\205\169\242"}}, metrics = ApiStakePoolMetrics {nonMyopicMemberRewards = Quantity {getQuantity = 597988295434}, relativeStake = Quantity {getQuantity = Percentage {getPercentage = 1013 % 2000}}, saturation = 1.519466463252439, producedBlocks = Quantity {getQuantity = 900}}, metadata = Nothing, cost = Quantity {getQuantity = 0}, margin = Quantity {getQuantity = Percentage {getPercentage = 1 % 10}}, pledge = Quantity {getQuantity = 1000000000000}, retirement = Just (ApiEpochInfo {epochNumber = ApiT {getApiT = EpochNo {unEpochNo = 100000}}, epochStartTime = 2021-02-09 02:38:28 UTC}), flags = []}])
  | Waited longer than 90s to resolve action: "list pools returns non-empty list".
  |  
  | To rerun use: --match "/API Specifications/SHELLEY_STAKE_POOLS/STAKE_POOLS_LIST_01 - List stake pools/has non-zero saturation & stake/"
  |  


Possibly:
#2467

@Anviking
Copy link
Collaborator Author

bors r+

@iohk-bors
Copy link
Contributor

iohk-bors bot commented Jan 28, 2021

Build succeeded:

@iohk-bors iohk-bors bot merged commit cab62e9 into master Jan 28, 2021
@iohk-bors iohk-bors bot deleted the anviking/ADP-623/era-info branch January 28, 2021 14:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
IMPROVEMENT Mark a PR as an improvement, for auto-generated CHANGELOG
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants