migrate
Contract: JBPayoutRedemptionPaymentTerminal
Interface: IJBPayoutRedemptionPaymentTerminal
- Step by step
- Code
- Errors
- Events
- Bug bounty
Allows a project owner to migrate its funds and operations to a new terminal that accepts the same token type.
Only a project's owner or a designated operator can migrate it.
Definition
function migrate(uint256 _projectId, IJBPaymentTerminal _to)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.MIGRATE_TERMINAL)
returns (uint256 balance) { ... }
- Arguments:
_projectId
is the ID of the project being migrated._to
is the terminal contract that will gain the project's funds.
- Through the
requirePermission
modifier, the function is only accessible by the project's owner, or from an operator that has been given theJBOperations.MIGRATE_TERMINAL
permission by the project owner for the provided_projectId
. - The function can be overriden by inheriting contracts.
- The resulting function overrides a function definition from the
IJBPayoutRedemptionPaymentTerminal
interface. - The function returns the amount of funds that were migrated, as a fixed point number with the same amount of decimals as this terminal.
Body
-
Make sure the token type of the terminal being migrated to matches the token type of this terminal.
// The terminal being migrated to must accept the same token as this terminal.
if (!_to.acceptsToken(token, _projectId)) revert TERMINAL_TOKENS_INCOMPATIBLE();Internal references:
External references:
-
Record the migration and get a reference to the project's balance.
// Record the migration in the store.
balance = store.recordMigration(_projectId);Internal references:
External references:
-
If there's a balance to migrate, move the funds over to the new terminal. Send ETH along with the transaction if this terminal is an ETH terminal. Make sure any inherited pre-transfer logic is called before transferring.
// Transfer the balance if needed.
if (balance > 0) {
// Trigger any inherited pre-transfer logic.
_beforeTransferTo(address(_to), balance);
// If this terminal's token is ETH, send it in msg.value.
uint256 _payableValue = token == JBTokens.ETH ? balance : 0;
// Withdraw the balance to transfer to the new terminal;
_to.addToBalanceOf{value: _payableValue}(balance, _projectId, token, '', bytes(''));
}Library references:
JBTokens
.ETH
Virtual references:
Internal references:
-
Emit a
Migrate
event with the relevant parameters.emit Migrate(_projectId, _to, balance, msg.sender);
Event references:
/**
@notice
Allows a project owner to migrate its funds and operations to a new terminal that accepts the same token type.
@dev
Only a project's owner or a designated operator can migrate it.
@param _projectId The ID of the project being migrated.
@param _to The terminal contract that will gain the project's funds.
@return balance The amount of funds that were migrated, as a fixed point number with the same amount of decimals as this terminal.
*/
function migrate(uint256 _projectId, IJBPaymentTerminal _to)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.MIGRATE_TERMINAL)
returns (uint256 balance)
{
// The terminal being migrated to must accept the same token as this terminal.
if (!_to.acceptsToken(token, _projectId)) revert TERMINAL_TOKENS_INCOMPATIBLE();
// Record the migration in the store.
balance = store.recordMigration(_projectId);
// Transfer the balance if needed.
if (balance > 0) {
// Trigger any inherited pre-transfer logic.
_beforeTransferTo(address(_to), balance);
// If this terminal's token is ETH, send it in msg.value.
uint256 _payableValue = token == JBTokens.ETH ? balance : 0;
// Withdraw the balance to transfer to the new terminal;
_to.addToBalanceOf{value: _payableValue}(_balance, _projectId, token, '', bytes(''));
}
emit Migrate(_projectId, _to, balance, msg.sender);
}
String | Description |
---|---|
TERMINAL_TOKENS_INCOMPATIBLE | Thrown if the terminal being migrated to doesn't use the same token as this terminal. |
Name | Data |
---|---|
Migrate |
|
Category | Description | Reward |
---|---|---|
Optimization | Help make this operation more efficient. | 0.5ETH |
Low severity | Identify a vulnerability in this operation that could lead to an inconvenience for a user of the protocol or for a protocol developer. | 1ETH |
High severity | Identify a vulnerability in this operation that could lead to data corruption or loss of funds. | 5+ETH |