-
Notifications
You must be signed in to change notification settings - Fork 849
Merge Transfer and TransferWithGas gadget #1777
Changes from 19 commits
11be6ee
2811228
7f73a7f
45e19c6
f62b1cc
b919f09
0241779
618f033
37c3fd1
f82c3a7
79d2c3f
52e80c4
0ee4aa4
e3e1b1c
56ccc66
7a13f05
598ad11
0522b5c
77cfbcb
990afe1
7449289
f8773e2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -559,13 +559,13 @@ impl<'a> CircuitInputStateRef<'a> { | |
/// balance by `value`. If `fee` is existing (not None), also need to push 1 | ||
/// non-reversible [`AccountOp`] to update `sender` balance by `fee`. | ||
#[allow(clippy::too_many_arguments)] | ||
pub fn transfer_with_fee( | ||
pub fn transfer( | ||
&mut self, | ||
step: &mut ExecStep, | ||
sender: Address, | ||
receiver: Address, | ||
receiver_exists: bool, | ||
must_create: bool, | ||
opcode_is_create: bool, | ||
value: Word, | ||
fee: Option<Word>, | ||
) -> Result<(), Error> { | ||
|
@@ -608,68 +608,29 @@ impl<'a> CircuitInputStateRef<'a> { | |
sender_balance_prev, | ||
sender_balance | ||
); | ||
// If receiver doesn't exist, create it | ||
if !receiver_exists && (!value.is_zero() || must_create) { | ||
|
||
if !value.is_zero() { | ||
self.push_op_reversible( | ||
step, | ||
AccountOp { | ||
address: receiver, | ||
field: AccountField::CodeHash, | ||
value: CodeDB::empty_code_hash().to_word(), | ||
value_prev: Word::zero(), | ||
address: sender, | ||
field: AccountField::Balance, | ||
value: sender_balance, | ||
value_prev: sender_balance_prev, | ||
}, | ||
)?; | ||
} | ||
if value.is_zero() { | ||
// Skip transfer if value == 0 | ||
return Ok(()); | ||
} | ||
|
||
self.push_op_reversible( | ||
step, | ||
AccountOp { | ||
address: sender, | ||
field: AccountField::Balance, | ||
value: sender_balance, | ||
value_prev: sender_balance_prev, | ||
}, | ||
)?; | ||
|
||
let (_found, receiver_account) = self.sdb.get_account(&receiver); | ||
let receiver_balance_prev = receiver_account.balance; | ||
let receiver_balance = receiver_account.balance + value; | ||
self.push_op_reversible( | ||
self.transfer_to( | ||
step, | ||
AccountOp { | ||
address: receiver, | ||
field: AccountField::Balance, | ||
value: receiver_balance, | ||
value_prev: receiver_balance_prev, | ||
}, | ||
)?; | ||
|
||
Ok(()) | ||
} | ||
|
||
/// Same functionality with `transfer_with_fee` but with `fee` set zero. | ||
pub fn transfer( | ||
&mut self, | ||
step: &mut ExecStep, | ||
sender: Address, | ||
receiver: Address, | ||
receiver_exists: bool, | ||
must_create: bool, | ||
value: Word, | ||
) -> Result<(), Error> { | ||
self.transfer_with_fee( | ||
step, | ||
sender, | ||
receiver, | ||
receiver_exists, | ||
must_create, | ||
opcode_is_create, | ||
value, | ||
None, | ||
) | ||
true, | ||
)?; | ||
|
||
Ok(()) | ||
} | ||
|
||
/// Transfer to an address. Create an account if it is not existed before. | ||
|
@@ -678,12 +639,11 @@ impl<'a> CircuitInputStateRef<'a> { | |
step: &mut ExecStep, | ||
receiver: Address, | ||
receiver_exists: bool, | ||
must_create: bool, | ||
opcode_is_create: bool, | ||
value: Word, | ||
reversible: bool, | ||
) -> Result<(), Error> { | ||
// If receiver doesn't exist, create it | ||
if (!receiver_exists && !value.is_zero()) || must_create { | ||
if !receiver_exists && (!value.is_zero() || opcode_is_create) { | ||
|
||
self.account_write( | ||
step, | ||
receiver, | ||
|
Uh oh!
There was an error while loading. Please reload this page.