Documents the use of increaseAllowance in OpenZeppelin's ERC20 implementation.
The increaseAllowance function of OpenZeppelin's ERC20 implementation is
being used, which is not part of the standard ERC20 interface. If the Codex
token must be an ERC20 token (eg DAI), then that token will need to be wrapped in
OpenZeppelin's ERC20Wrapped to ensure that increaseAllowance is available.
The reason increaseAllowance is needed is because the sales state machine
handles concurrent slot fills, which requires token approval. Because these
approvals happen concurrently, simply calling approve is not sufficient as
each approve amount will overwrite the previous. As an example, if a single
node attempts to fill two slots simultaneously, it will send two approve
transactions followed by two fillSlot transactions. The first two approve
transactions will each approve the collateral amount for one fillSlot, the
second overwriting the first, so the total approved will only ever be enough for
one fillSlot. So after the first fillSlot is sent, the second one will fail
as not enough tokens will have been approved. The solution is use
increaseAllowance instead of approve which increases the allowance instead
of overwriting it.
Documents the use of
increaseAllowance
in OpenZeppelin'sERC20
implementation.The
increaseAllowance
function of OpenZeppelin's ERC20 implementation is being used, which is not part of the standard ERC20 interface. If the Codex token must be an ERC20 token (eg DAI), then that token will need to be wrapped in OpenZeppelin's ERC20Wrapped to ensure thatincreaseAllowance
is available.The reason
increaseAllowance
is needed is because the sales state machine handles concurrent slot fills, which requires token approval. Because these approvals happen concurrently, simply callingapprove
is not sufficient as eachapprove
amount will overwrite the previous. As an example, if a single node attempts to fill two slots simultaneously, it will send twoapprove
transactions followed by twofillSlot
transactions. The first twoapprove
transactions will each approve the collateral amount for onefillSlot
, the second overwriting the first, so the total approved will only ever be enough for onefillSlot
. So after the firstfillSlot
is sent, the second one will fail as not enough tokens will have been approved. The solution is useincreaseAllowance
instead ofapprove
which increases the allowance instead of overwriting it.