Releases: graphprotocol/indexer
Release v0.21.5
What's Changed
- agent: large memory leak fixed by @dwerner in #1018
- fix: use subgraph timestamp for tap by @gusinacio in #995
- fix: disable stakeUsageSummary test by @dwerner in #999
- feat: add error_log into scalar_tap_receipts_invalid by @carlosvdr in #974
- feat: Add new column to invalid_receipts table by @carlosvdr in #987
- feat: check escrow balance before rav redeem by @gusinacio in #1015
- refactor: split tap and scalar by @gusinacio in #1012
- fix: add pagination to tap collector by @gusinacio in #1013
- fix: check ravs every 15 minutes by @gusinacio in #1016
Docs
- docs: update versions for 0.21.4 by @dwerner in #992
- docs: Add 2 chains to feature matrix: fuse & blast by @p-diogo in #979
- Update arbitrum-sepolia.md for TAP by @aasseman in #1001
- Update arbitrum-one.md by @aasseman in #1002
- Update arbitrum-sepolia.md with indexer-rs v1.0.0 by @aasseman in #1007
- Update arbitrum-one.md with indexer-rs v1.0.0 by @aasseman in #1006
New Contributors
- @gusinacio made their first contribution in #995
Full Changelog: v0.21.4...v0.21.5
v0.21.4-5
Performance fix release v0.21.4-5
- removes a workaround where we had to query the graph-node for indexingStatus twice to determine a deployment's state
- moves flushOutstanding (receipts) to use READ_COMMITTED isolation level
- bumps urql to 3.1.0 and common-ts to 2.0.10 to bring in the upstream memory leak fix
v0.21.4
Important Node.js Version Update
The version of node.js required to run the indexer is one of 18, 20, 22. This is to keep within LTS maintenance and support. If another version of node.js is used, you may see a Segmentation Fault
when attempting to run. This is a known issue.
Indexer CLI
- Receipts collect - new command to initiate receipt collection for an allocation. PR #903
- Improve testing setup: Add type annotation for test utility network specifications. PR #944
Agent and Common
- Improve deployment management PR #868:
- Indexer-agent no longer makes assignment decisions, instead relying on graph-node to assign deployments.
- Pause mechanism in graph-node now used to better control pausing and resuming deployments.
- Support for closing allocations on unsupported networks. PR #949
- Enhance gas fee and price logging within the
TransactionManager
to provide better insights into transaction costs. PR #954 - Update default values for
subgraph.maxBlockDistance
to reduce agent halting to wait for subgraphs. The previous default was overly strict at 0 blocks. PR #955 - Make
tap
and RAV feature optional: Indexer may usetapSubgraph
config to control the feature (not used when not set). PR #952 - Allow configuring polling interval for data collection in
agent
. PR #977 - Improve collision resistance of allocation IDs in
common
. PR #981 - Add logging for endpoint in freshness checker in
common
. PR #839 - Add Moonbeam, Fuse, and Blast to chain ID lookups in
common
. PR #980 - Remove failed subgraph check in
common
. PR #984 - Fix database migration for
value_aggregate
inagent
from 20 to 39 digits. PR #973 - Fix indexerStatus (paused) query by @dwerner in #989
- Improve DB migration 14 which migrates deployments to use pause mechanism by @fordN in #990
Indexer-native
- Update
indexer-native
to support neon 1.0.0 and napi-6. PR #975
Fixes
- Remove
queryInterface
references to reduce the amount of objects being passed around. PR #948 - Fix paused mechanism in
indexer-common
to ensure proper handling of deployment states. PR #986 - Defend against graph-node bug #5550 (null paused) in
agent
. PR #978 - Remove LRU max length by @dwerner in #991
Documentation
- Remove outdated Scalar documentation to ensure users reference the most current information. PR #877
- Eliminate references to the deprecated
ethereum-network
parameter and updategateway
parameters for clearer configuration. PR #953
Continuous Integration
- Remove support for Node.js 19 and add support for Node.js 22 to ensure compatibility with newer Node.js features and performance improvements. PR #874
- Add a package manager for Corepack detection to streamline dependency management. PR #942
Full Changelog: v0.21.3...v0.21.4
v0.21.3
Changes and fixes
- indexer-agent: if alias does not exist try the actual flag by @saihaj in #838
- indexer-agent: Avoid race conditions when queuing actions (hopefully fixes #879) by @Jannis in #883
- indexer-agent: broken comparison of indexing decisions by @Theodus in #870
- indexer-agent,indexer-common: Cleanup migration 12 by @carlosvdr in #932
- indexer-agent,indexer-common: Improve control of subgraph deployment health safety check by @fordN in #852
- indexer-agent,indexer-common: feat: allow early allocation closure by @tmigone in #895
- indexer-agent,indexer-common: lower the default parameters for query fee claiming by @chriswessels in #922
- indexer-agent,indexer-common,indexer-cli: Allow cost models in single network mode by @aasseman in #899
- indexer-agent,indexer-common: fix tsconfig, error-handling export by @dwerner in #935
- indexer-agent,indexer-common,indexer-service: feat optionally override address book by @Theodus in #818
- indexer-agent,indexer-common,indexer-service: use sepolia instead of goerli for tests by @saihaj in #871
- indexer-common: Add support for BSC, Base, Linea, Scroll by @fordN in #934
- indexer-common: Upgrade @graphprotocol/cost-model by @fordN in #829
- indexer-common: Avoid using createdAt field for pagination by @fordN in #914
- indexer-common: Add more tests into tap.tests by @carlosvdr in #892
- indexer-integration-tests: start integration test package by @dwerner in #891
- indexer-service: Use consistent authorization header formats by @fordN in #896
- indexer-service: Support setting rate limits and body size limits at startup by @fordN in #900
- indexer-service: Increase size of attestation signer cache by @fordN in #906
- indexer-service: Server integration tests by @fordN in #901
- indexer-service: fix paginate allocation queries by @Theodus in #862
- *: Make tapSubgraph to be an optional value by @carlosvdr in #904
- *: bump versions by @dwerner in #938
- *: Collect tap ravs by @carlosvdr in #869
- docker: increase memory limit for node-js by @DaMandal0rian in #865
- workflows: Fix formatting of Setup Python step in image build workflows by @fordN in #850
Doc and config updates
- Add Optimism to support matrix by @fordN in #849
- Release graph-node v0.34.0 to mainnet by @incrypto32 in #848
- Release graph-node v0.35.0-rc.0 to testnet by @fordN in #872
- Docs: updated feature support matrix with Graph Node v0.34.1 by @PedroMD in #855
- docs: added base, bsc, scroll and linea to the feature support matrix by @PedroMD in #898
- chore: update network subgraph deployment hashes by @juanmardefago in #897
- fix: arbitrum-sepolia.md signer address by @aasseman in #884
- Update feature support (ens, arweave, 0.35.x) by @azf20 in #886
- Update hosted service subgraph endpoints in
/docs
&/docs/config-examples
by @alex-pakalniskis in #909 - Add missing addresses and resolve table formatting issues in network docs by @alex-pakalniskis in #924
New Contributors
- @saihaj made their first contribution in #838
- @dwerner made their first contribution in #891
- @carlosvdr made their first contribution in #869
- @alex-pakalniskis made their first contribution in #909
Full Changelog: v0.21.2...v0.21.3
v0.21.2
What's Changed
Changes and fixes
- indexer-agent: Fix bug in stake usage summary by @fordN in #801
- indexer-agent: Support subgraphs syncing sepolia and arbitrum-sepolia by @fordN in #819
- indexer-agent: Improve robustness of DAI contract contract calls by @fordN in #825
- indexer-agent: add tests for allocation decision consolidation by @tilacog in #767
- indexer-agent: Improve batch action preparation by @fordN in #817
- indexer-service: fix allocation monitor query by @tilacog in #808
- indexer-service: Various robustness improvements by @fordN in #821
- indexer-service: Improve validation of operator wallet by @fordN in #826
- indexer-service: Add graph-node version endpoint from status api by @abarmat in #841
- indexer-common: Reduce stringency of action validation when adding to queue by @fordN in #833
Docs and config updates
- Release graph-node v0.33.0-rc.0 to testnet by @incrypto32 in #804
- Release graph-node v0.33.0 to mainnet by @incrypto32 in #812
- Update feature-support-matrix.md w/ Graph Node v0.33.0 as minimum ver… by @PedroMD in #810
- docs: fix gateway url for arbitrum-one by @chriswessels in #795
- docs/networks: Add network config docs for Sepolia and Arbitrum Sepolia by @fordN in #820
- docs/networks: Arbitrum and Arbitrum Goerli update by @tomasztrzos in #823
Chores
- chore: fix typos by @xiaolou86 in #813
- Upgrade common-ts dependency by @fordN in #822
- Call
yarn clean
in the release script. by @tilacog in #648
New Contributors
- @xiaolou86 made their first contribution in #813
- @tomasztrzos made their first contribution in #823
Full Changelog: v0.20.23...v0.21.2
v0.20.23
For the complete list of issues resolved by this release, check the v0.20.23 Milestone.
v0.20.22
v0.20.21
v0.20.20
Adds the capacity for the Agent to interact with multiple protocol networks (blockchains that host The Graph Protocol) by running a single instance of the indexer-agent
program.
Table of Contents
Multi-Network Mode
Multinetwork Mode can be enabled by setting the environment variable INDEXER_AGENT_MULTINETWORK_MODE
to "true"
.
While in multinetwork mode, the Indexer Agent will perform all of its usual routines, but for each
specified network.
In that mode, each protocol network is represented by one YAML file under the same directory, which can
be decalred in the command line argument --network-specifications-directory
, which must be a path
the Indexer Agent can access during its startup.
Example Network Specification Files
Goerli
This example network specification YAML file represents all possible configuration fields and their
default values.
networkIdentifier: goerli # could also be named "eipp155:5"
gateway:
url: https://gateway.testnet.thegraph.com
indexerOptions:
address: "0x391042eC4ae8ab799Efdfd82021d059a19c6ED86"
mnemonic: "aunt what review ordinary initial rocket wheel enter private chef tree surface"
url: http://localhost:7600
allocationManagementMode: auto
restakeRewards: true
rebateClaimThreshold: 200
rebateClaimBatchThreshold: 200
rebateClaimMaxBatchSize: 100
poiDisputeMonitoring: false
poiDisputableEpochs: 1
defaultAllocationAmount: 0.1
voucherRedemptionThreshold: 200
voucherRedemptionBatchThreshold: 2000
voucherRedemptionMaxBatchSize: 100
autoAllocationMinBatchSize: 1
allocateOnNetworkSubgraph: false
register: true
transactionMonitoring:
gasPriceMax: 100
gasIncreaseTimeout: 240 # in seconds
gasIncreaseFactor: 1.2
gasPriceMax: 100 # in gwei
baseFeePerGasMax: 100 # in gwei
maxTransactionAttempts: 0 # zero retries indefinitely
subgraphs:
networkSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-goerli
deployment: QmRFMZT2rmdo558S8GWPNYJ61qchSUTEMHirYnm4MRqHEP
epochSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/goerli-epoch-block-oracle
networkProvider:
url: "<insert the URL of your Goerli JSON-RPC provider here>"
dai:
# Mind that the cost model feature is only enabled for Ethereum Mainnet (see notes below)
contractAddress: "0x11fE4B6AE13d2a6055C8D9cF65c55bac32B5d844"
inject: true
Arbitrum Goerli
In turn, this YAML network specification file represents just the required fields.
networkIdentifier: arbitrum-goerli # could also be named "eipp155:421613"
gateway:
url: https://gateway-testnet-arbitrum.network.thegraph.com
indexerOptions:
address: "0x79EB6E112a00A4b99B8ABf0B983159d54A8be316"
mnemonic: "juice zebra sister column fit praise behind trust merit slab place general"
url: http://localhost:7600
allocationManagementMode: oversight
subgraphs:
networkSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-arbitrum-goerli
deployment: QmW8YxdkQjFb7wHMDo9u4DodLga4YHdByfKsBxCCcUx6cQ
epochSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/arb-goerli-epoch-block-oracle
networkProvider:
url: "<insert the URL of your Goerli JSON-RPC provider here>"
API Changes
The Indexer Agent GraphQL API was updated to accept (and in some cases require) a protocolNetwork
parameter to determine which network should be used for queries or mutations.
Likewise,the Indexer CLI was updated to accept the --network
option as the context for most of its
commands.
GraphQL API Changes
# --------------------------------------------------------------------------------
# * inputs
# --------------------------------------------------------------------------------
input AllocationFilter {
protocolNetwork: String # new optional filtering parameter
}
input ActionInput {
protocolNetwork: String! # new required parameter
}
input ActionFilter {
protocolNetwork: String # new optional filtering parameter
}
# New dedicated identifier type
input POIDisputeIdentifier {
allocationID: String!
protocolNetwork: String!
}
input POIDisputeInput {
protocolNetwork: String! # new required parameter
}
input IndexingRuleInput {
protocolNetwork: String! # new required parameter
}
# New dedicated identifier type
input IndexingRuleIdentifier {
identifier: String!
protocolNetwork: String!
}
# --------------------------------------------------------------------------------
# * types
# --------------------------------------------------------------------------------
type Allocation {
protocolNetwork: String! # new non-nullable field
}
type CreateAllocationResult {
protocolNetwork: String! # new non-nullable field
}
type CloseAllocationResult {
protocolNetwork: String! # new non-nullable field
}
type ReallocateAllocationResult {
protocolNetwork: String! # new non-nullable field
}
type Action {
protocolNetwork: String! # new non-nullable field
}
type ActionResult {
protocolNetwork: String! # new non-nullable field
}
type POIDispute {
protocolNetwork: String! # new non-nullable field
}
type IndexingRule {
protocolNetwork: String! # new non-nullable field
}
type IndexerRegistration {
protocolNetwork: String # new non-nullable field
}
type IndexerEndpoint {
protocolNetwork: String! # new optional filtering parameter
}
#--------------------------------------------------------------------------------
# * enums
# --------------------------------------------------------------------------------
enum ActionParams {
protocolNetwork # new enum variant
}
# --------------------------------------------------------------------------------
# * queries
# --------------------------------------------------------------------------------
type Query {
indexingRule(
identifier: IndexingRuleIdentifier! # parameter type changed from String!
): IndexingRule
indexingRules(
protocolNetwork: String # new optional filtering parameter
): [IndexingRule!]!
indexerRegistration(
protocolNetwork: String! # new required parameter
): IndexerRegistration!
indexerAllocations(
protocolNetwork: String! # new required parameter
): [IndexerAllocation]!
indexerEndpoints(
protocolNetwork: String! # new required parameter
): [IndexerEndpoints!]!
dispute(
identifier: POIDisputeIdentifier! # parameter type changed from String!
): POIDispute
disputes(
protocolNetwork: String # new optional filtering parameter
): [POIDispute]!
disputesClosedAfter(
protocolNetwork: String # new optional filtering parameter
): [POIDispute]!
}
# --------------------------------------------------------------------------------
# * mutations
# --------------------------------------------------------------------------------
type Mutation {
deleteIndexingRule(
identifier: IndexingRuleIdentifier! # parameter type changed from String!
): Boolean!
deleteIndexingRules(
identifiers: [IndexingRuleIdentifier!]! # parameter changed from [String!]!
): Boolean!
deleteDisputes(
identifiers: [POIDisputeIdentifier!]! # parameter changed from [String!]!
): Int!
createAllocation(
protocolNetwork: String # new required parameter
): CreateAllocationResult!
closeAllocation(
protocolNetwork: String! # new required parameter
): CloseAllocationResult!
reallocateAllocation(
protocolNetwork: String! # new required parameter
): ReallocateAllocationResult!
}
Indexer CLI command changes
Most indexer-cli
commands now accept or require a network
argument, to bring the protocol network
into the command's context
-
Commands that now accept the
--network
option to filter its results- indexer actions get
- indexer allocations get
- indexer disputes get
- indexer rules get
-
Commands that now require the
--network
option- indexer actions queue
- indexer rules clear
- indexer rules delete
- indexer rules maybe
- indexer rules offchain
- indexer rules set
- indexer rules start
- indexer rules stop
- indexer status
-
Commands that now require a
network
positional argument- indexer allocations close
- indexer allocations create
- indexer allocations reallocate
The /network
endopoint
The /network
endpoint exposed by the Agent now requires an additional path segment to disambiguate
which protocol network it should target.
Assuming the Agent is configured with those networks, all the paths below are valid:
/network/mainnet
/network/eip155:1
/network/arbitrum-one
/network/eip155:42161
/network/goerli
/network/eip155:5
/network/arbitrum-goerli
/network/eip155:421613
Database Migrations
A new database migration will create a...
v0.20.18
L2 Support for Indexer Agent
Adds the capacity for the Agent to interact with multiple protocol networks (blockchains that host The Graph Protocol) by running a single instance of the indexer-agent
program.
Table of Contents
Multi-Network Mode
Multinetwork Mode can be enabled by setting the environment variable INDEXER_AGENT_MULTINETWORK_MODE
to "true"
.
While in multinetwork mode, the Indexer Agent will perform all of its usual routines, but for each
specified network.
In that mode, each protocol network is represented by one YAML file under the same directory, which can
be decalred in the command line argument --network-specifications-directory
, which must be a path
the Indexer Agent can access during its startup.
Example Network Specification Files
Goerli
This example network specification YAML file represents all possible configuration fields and their
default values.
networkIdentifier: goerli # could also be named "eipp155:5"
gateway:
url: https://gateway.testnet.thegraph.com
indexerOptions:
address: "0x391042eC4ae8ab799Efdfd82021d059a19c6ED86"
mnemonic: "aunt what review ordinary initial rocket wheel enter private chef tree surface"
url: http://localhost:7600
allocationManagementMode: auto
restakeRewards: true
rebateClaimThreshold: 200
rebateClaimBatchThreshold: 200
rebateClaimMaxBatchSize: 100
poiDisputeMonitoring: false
poiDisputableEpochs: 1
defaultAllocationAmount: 0.1
voucherRedemptionThreshold: 200
voucherRedemptionBatchThreshold: 2000
voucherRedemptionMaxBatchSize: 100
autoAllocationMinBatchSize: 1
allocateOnNetworkSubgraph: false
register: true
transactionMonitoring:
gasPriceMax: 100
gasIncreaseTimeout: 240 # in seconds
gasIncreaseFactor: 1.2
gasPriceMax: 100 # in gwei
baseFeePerGasMax: 100 # in gwei
maxTransactionAttempts: 0 # zero retries indefinitely
subgraphs:
networkSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-goerli
deployment: QmRFMZT2rmdo558S8GWPNYJ61qchSUTEMHirYnm4MRqHEP
epochSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/goerli-epoch-block-oracle
networkProvider:
url: "<insert the URL of your Goerli JSON-RPC provider here>"
dai:
# Mind that the cost model feature is only enabled for Ethereum Mainnet (see notes below)
contractAddress: "0x11fE4B6AE13d2a6055C8D9cF65c55bac32B5d844"
inject: true
Arbitrum Goerli
In turn, this YAML network specification file represents just the required fields.
networkIdentifier: arbitrum-goerli # could also be named "eipp155:421613"
gateway:
url: https://gateway-testnet-arbitrum.network.thegraph.com
indexerOptions:
address: "0x79EB6E112a00A4b99B8ABf0B983159d54A8be316"
mnemonic: "juice zebra sister column fit praise behind trust merit slab place general"
url: http://localhost:7600
allocationManagementMode: oversight
subgraphs:
networkSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-arbitrum-goerli
deployment: QmW8YxdkQjFb7wHMDo9u4DodLga4YHdByfKsBxCCcUx6cQ
epochSubgraph:
url: https://api.thegraph.com/subgraphs/name/graphprotocol/arb-goerli-epoch-block-oracle
networkProvider:
url: "<insert the URL of your Goerli JSON-RPC provider here>"
API Changes
The Indexer Agent GraphQL API was updated to accept (and in some cases require) a protocolNetwork
parameter to determine which network should be used for queries or mutations.
Likewise,the Indexer CLI was updated to accept the --network
option as the context for most of its
commands.
GraphQL API Changes
# --------------------------------------------------------------------------------
# * inputs
# --------------------------------------------------------------------------------
input AllocationFilter {
protocolNetwork: String # new optional filtering parameter
}
input ActionInput {
protocolNetwork: String! # new required parameter
}
input ActionFilter {
protocolNetwork: String # new optional filtering parameter
}
# New dedicated identifier type
input POIDisputeIdentifier {
allocationID: String!
protocolNetwork: String!
}
input POIDisputeInput {
protocolNetwork: String! # new required parameter
}
input IndexingRuleInput {
protocolNetwork: String! # new required parameter
}
# New dedicated identifier type
input IndexingRuleIdentifier {
identifier: String!
protocolNetwork: String!
}
# --------------------------------------------------------------------------------
# * types
# --------------------------------------------------------------------------------
type Allocation {
protocolNetwork: String! # new non-nullable field
}
type CreateAllocationResult {
protocolNetwork: String! # new non-nullable field
}
type CloseAllocationResult {
protocolNetwork: String! # new non-nullable field
}
type ReallocateAllocationResult {
protocolNetwork: String! # new non-nullable field
}
type Action {
protocolNetwork: String! # new non-nullable field
}
type ActionResult {
protocolNetwork: String! # new non-nullable field
}
type POIDispute {
protocolNetwork: String! # new non-nullable field
}
type IndexingRule {
protocolNetwork: String! # new non-nullable field
}
type IndexerRegistration {
protocolNetwork: String # new non-nullable field
}
type IndexerEndpoint {
protocolNetwork: String! # new optional filtering parameter
}
#--------------------------------------------------------------------------------
# * enums
# --------------------------------------------------------------------------------
enum ActionParams {
protocolNetwork # new enum variant
}
# --------------------------------------------------------------------------------
# * queries
# --------------------------------------------------------------------------------
type Query {
indexingRule(
identifier: IndexingRuleIdentifier! # parameter type changed from String!
): IndexingRule
indexingRules(
protocolNetwork: String # new optional filtering parameter
): [IndexingRule!]!
indexerRegistration(
protocolNetwork: String! # new required parameter
): IndexerRegistration!
indexerAllocations(
protocolNetwork: String! # new required parameter
): [IndexerAllocation]!
indexerEndpoints(
protocolNetwork: String! # new required parameter
): [IndexerEndpoints!]!
dispute(
identifier: POIDisputeIdentifier! # parameter type changed from String!
): POIDispute
disputes(
protocolNetwork: String # new optional filtering parameter
): [POIDispute]!
disputesClosedAfter(
protocolNetwork: String # new optional filtering parameter
): [POIDispute]!
}
# --------------------------------------------------------------------------------
# * mutations
# --------------------------------------------------------------------------------
type Mutation {
deleteIndexingRule(
identifier: IndexingRuleIdentifier! # parameter type changed from String!
): Boolean!
deleteIndexingRules(
identifiers: [IndexingRuleIdentifier!]! # parameter changed from [String!]!
): Boolean!
deleteDisputes(
identifiers: [POIDisputeIdentifier!]! # parameter changed from [String!]!
): Int!
createAllocation(
protocolNetwork: String # new required parameter
): CreateAllocationResult!
closeAllocation(
protocolNetwork: String! # new required parameter
): CloseAllocationResult!
reallocateAllocation(
protocolNetwork: String! # new required parameter
): ReallocateAllocationResult!
}
Indexer CLI command changes
Most indexer-cli
commands now accept or require a network
argument, to bring the protocol network
into the command's context
-
Commands that now accept the
--network
option to filter its results- indexer actions get
- indexer allocations get
- indexer disputes get
- indexer rules get
-
Commands that now require the
--network
option- indexer actions queue
- indexer rules clear
- indexer rules delete
- indexer rules maybe
- indexer rules offchain
- indexer rules set
- indexer rules start
- indexer rules stop
- indexer status
-
Commands that now require a
network
positional argument- indexer allocations close
- indexer allocations create
- indexer allocations reallocate
The /network
endopoint
The /network
endpoint exposed by the Agent now requires an additional path segment to disambiguate
which protocol network it should target.
Assuming the Agent is configured with those networks, all the paths below are valid:
/network/mainnet
/network/eip155:1
/network/arbitrum-one
/network/eip155:42161
/network/goerli
/network/eip155:5
/network/arbitrum-goerli
/network/eip155:421613
Database Migrations
A ne...