Erc20InputFacet
This facet handles the configuration of input packets for staking campaigns and facilitates the transfer of these input packets.
_This implementation is designed for use in staking campaigns where the input packet is constructed solely from ERC20 tokens.
IMPORTANT:
- Extra care should be taken when specifying token amounts, especially when dealing with tokens of
varying decimal precision (see
setCampaignTransferInput()for more details). - An input packet can encapsulate one (e.g., tokenA) or more (e.g., tokenA, tokenB, ..., tokenX) ERC20 tokens._
CampaignInputConfigured
Emitted at setCampaignTransferInput().
CampaignInputPacketsTransferred
Emitted at transferInput().
setCampaignTransferInput
Setter function for configuring the input packet for the specified staking campaign.
_Setter functions are executed during the creation process of campaigns (see CampaignCreationSkeleton.sol).
This setter function configures the input packet for a campaign, where only ERC20 tokens should be included.
Emits a {CampaignInputConfigured} event.
Requirements:
- The
tokenAddressesandamountOfTokensPerPacketarrays must have the same length. tokenAddressesmust contain valid, non-zero ERC20 token addresses.amountOfTokensPerPacketmust contain non-zero values.
IMPORTANT:
-
If all ERC20 tokens in
tokenAddresseshave the same decimal places, there are two configuration options.-
Parse the values in
amountOfTokensPerPacketwith the appropriate common number of decimal digits (using wei values). In this case, input packet amounts should be specified in whole units at the API level forstake(),restake(),partialUnstake(), andfullyUnstake()(seeStakingSkeleton.sol). This is the recommended configuration option. -
Specify values in
amountOfTokensPerPacketin whole units, thus, input packet amounts should be parsed with the appropriate number of decimal digits at the API level instake(),restake(),partialUnstake(), andfullyUnstake()(seeStakingSkeleton.sol).
-
-
If any ERC20 token in
tokenAddresseshas a different decimal precision than others, only one option is valid:Parse the values in
amountOfTokensPerPacketwith each token's decimal precision (using wei values), thus, input packet amounts should be specified in whole units at the API level forstake(),restake(),partialUnstake(), andfullyUnstake()(seeStakingSkeleton.sol). ----------------------------------------------------------------------------------------------------------------_
Parameters
| Name | Type | Description |
|---|---|---|
| campaignId | uint256 | The unique identifier of the targeted staking campaign. |
| campaignTransferInputData | bytes | The ABI-encoded data containing the following: - tokenAddresses: An address array containing the addresses of the ERC20 tokens encapsulated by the input packet. - amountOfTokensPerPacket: A uint256 array specifying the amount for each corresponding token in tokenAddresses. |
transferInput
Transfers the specified amount of a given campaign's input packets from the from address
to the to address.
_This function iteratively executes transfers for all respective amounts of ERC20 tokens defined
in the campaign's input packet (see setCampaignTransferInput()) in a single transaction.
The amounts to be transferred are calculated as
amountOfTokensPerPacket[i] * amountOfPackets for each token in the input packet, where i
is the index of the token in the tokenAddresses array. The transfer is performed using
the safeTransferFrom method of the ERC20 token interface.
Emits a {CampaignInputPacketsTransferred} event._
Parameters
| Name | Type | Description |
|---|---|---|
| campaignId | uint256 | The unique identifier of the targeted staking campaign. |
| from | address | The address from which the ERC20 assets encapsulated by the specified number of input packets to be transferred. |
| to | address | The address to receive the ERC20 assets encapsulated by the specified number of input packets. |
| amountOfPackets | uint256 | The number of input packets to account for. |

