Skip to content

Commit 97273ad

Browse files
committed
feat: support replacing a task on a single transaction
1 parent 41af7fc commit 97273ad

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

contracts/ChainJetRunner.sol

+7-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ contract ChainJetRunner is OwnableUpgradeable {
3333
__Ownable_init();
3434
}
3535

36-
function enableTask(address _task) external payable {
36+
function enableTask(address _task) public payable {
3737
require(IOwnable(_task).owner() == msg.sender, 'enableTask: caller is not the owner');
3838
require(tasks[_task].addr == address(0), 'enableTask: task already enabled');
3939
if (msg.value > 0) {
@@ -45,13 +45,18 @@ contract ChainJetRunner is OwnableUpgradeable {
4545
emit TaskEnabled(_task, msg.sender);
4646
}
4747

48-
function disableTask(address _task) external {
48+
function disableTask(address _task) public {
4949
require(tasks[_task].addr != address(0), 'disableTask: task not enabled');
5050
require(tasks[_task].owner == msg.sender, 'disableTask: caller is not the owner');
5151
delete tasks[_task];
5252
emit TaskDisabled(_task);
5353
}
5454

55+
function replaceTask(address _oldTask, address _newTask) external {
56+
disableTask(_oldTask);
57+
enableTask(_newTask);
58+
}
59+
5560
function deposit() external payable {
5661
balances[msg.sender] += msg.value;
5762
emit Deposit(msg.sender, msg.value);

test-contracts/ChainJetRunner.spec.ts

+39
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,45 @@ describe('ChainJetRunner', () => {
132132
})
133133
})
134134

135+
describe('replaceTask', () => {
136+
it('should replace a task', async () => {
137+
const chainJetRunner = await deployChainJetRunner()
138+
const taskMock = await deployTaskMock(alice)
139+
const taskMock2 = await deployTaskMock(alice)
140+
await chainJetRunner.connect(alice).enableTask(taskMock.address, { value: parseUnits('1') })
141+
await chainJetRunner.connect(alice).replaceTask(taskMock.address, taskMock2.address)
142+
143+
const taskEnabled = await chainJetRunner.tasks(taskMock.address)
144+
expect(taskEnabled[0]).to.eq(ZERO_ADDRESS)
145+
expect(taskEnabled[1]).to.eq(ZERO_ADDRESS)
146+
147+
const taskEnabled2 = await chainJetRunner.tasks(taskMock2.address)
148+
expect(taskEnabled2[0]).to.eq(taskMock2.address)
149+
expect(taskEnabled2[1]).to.eq(alice.address)
150+
})
151+
152+
it('should revert if caller is not the owner', async () => {
153+
const chainJetRunner = await deployChainJetRunner()
154+
const taskMock = await deployTaskMock(alice)
155+
const taskMock2 = await deployTaskMock(alice)
156+
await chainJetRunner.connect(alice).enableTask(taskMock.address, { value: parseUnits('1') })
157+
158+
await expect(chainJetRunner.connect(eve).replaceTask(taskMock.address, taskMock2.address)).to.be.revertedWith(
159+
'disableTask: caller is not the owner',
160+
)
161+
})
162+
163+
it('should revert if the task is not enabled', async () => {
164+
const chainJetRunner = await deployChainJetRunner()
165+
const taskMock = await deployTaskMock(carol)
166+
const taskMock2 = await deployTaskMock(carol)
167+
168+
await expect(chainJetRunner.connect(carol).replaceTask(taskMock.address, taskMock2.address)).to.be.revertedWith(
169+
'disableTask: task not enabled',
170+
)
171+
})
172+
})
173+
135174
describe('deposit', () => {
136175
it('should increase depositor balance', async () => {
137176
const chainJetRunner = await deployChainJetRunner()

0 commit comments

Comments
 (0)