Skip to content

Commit

Permalink
value on signature
Browse files Browse the repository at this point in the history
  • Loading branch information
ermvrs committed Dec 6, 2024
1 parent f57b0e1 commit 64cdce4
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
22 changes: 18 additions & 4 deletions src/accounts/base.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,9 @@ pub mod RosettaAccount {
// Validate transaction signature
let expected_hash = generate_tx_hash(call);

let value_on_signature = self.get_transaction_value();
assert(call.value == value_on_signature, 'value sig-tx mismatch');

let signature = tx_info.signature; // Signature includes v,r,s
assert(self._is_valid_signature(expected_hash, signature), Errors::INVALID_SIGNATURE);
starknet::VALIDATED
Expand All @@ -174,9 +177,8 @@ pub mod RosettaAccount {
fn _is_valid_signature(
self: @ContractState, hash: u256, signature: Span<felt252>
) -> bool {
// TODO verify transaction with eth address not pub key
// Kakarot calldata ile transactionu bir daha olusturup verify etmeye calismis
assert(signature.len() == 5, 'Invalid Signature length');
// first 5 element signature, last 2 elements are value
assert(signature.len() == 7, 'Invalid Signature length');
let r: u256 = u256 {
low: (*signature.at(0)).try_into().unwrap(),
high: (*signature.at(1)).try_into().unwrap()
Expand All @@ -198,6 +200,18 @@ pub mod RosettaAccount {
is_valid_eth_signature(hash, eth_address, rosettanet_signature)
}

// We also store transaction value inside signature, TX will be reverted if value mismatch
// between signature and actual calldata
fn get_transaction_value(self: @ContractState) -> u256 {
let tx_info = get_tx_info().unbox();
let signature = tx_info.signature;
assert(signature.len() == 7, 'signature len wrong');
u256 {
low: (*signature.at(5)).try_into().unwrap(),
high: (*signature.at(6)).try_into().unwrap()
}
}

// TODO: write tests
fn update_addresses(self: @ContractState, calldata: Span<felt252>, directives: Span<u8>) -> Span<felt252> {
assert(calldata.len() == directives.len(), 'R-AB-1 sanity fails');
Expand Down Expand Up @@ -226,7 +240,7 @@ pub mod RosettaAccount {
assert(sn_address != starknet::contract_address_const::<0>(), 'receiver not registered');

let calldata: Span<felt252> = array![sn_address.into(), value.low.into(), value.high.into()].span();

// tx has to be reverted if not enough balance
call_contract_syscall(STRK_ADDRESS.try_into().unwrap(), TRANSFER_ENTRYPOINT, calldata).unwrap()
}
}
Expand Down
6 changes: 3 additions & 3 deletions tests/accounts_test.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ fn test_signature_validation() {
// EIP2930 tx hash
let eth_address: EthAddress = 0xE4306a06B19Fdc04FDf98cF3c00472f29254c0e1.try_into().unwrap();
let unsigned_tx_hash: u256 = 0x105d7b8d7c9fe830c123f2d99c01e09bfa7d902cb3b5afee409cf3dca533f52b;
let signature: Array<felt252> = array![0x3188ef10bf8469101d372e6b0960ed1b, 0x02bb74ffa5465b3dda0e353bbc3b6be3, 0x436c4cd167829819ce46024300e24d6d , 0x0739cb3999ae6842528ce5d8ec01a7fc , 0x1b]; // r.low, r.high, s.low, s.high, v
let signature: Array<felt252> = array![0x3188ef10bf8469101d372e6b0960ed1b, 0x02bb74ffa5465b3dda0e353bbc3b6be3, 0x436c4cd167829819ce46024300e24d6d , 0x0739cb3999ae6842528ce5d8ec01a7fc , 0x1b, 0x0,0x0]; // r.low, r.high, s.low, s.high, v

let (rosettanet, account) = deploy_account_from_rosettanet(eth_address);

Expand All @@ -59,7 +59,7 @@ fn test_signature_validation() {
fn test_wrong_signature() {
let eth_address: EthAddress = 0xE4306a06B19Fdc04FDf98cF3c00472f29254c0e1.try_into().unwrap();
let unsigned_tx_hash: u256 = 0x105d7b8d7c9fe830c123f2d99c01e09bfa7d902cb3b5afee409cf3dca533f52b;
let signature: Array<felt252> = array![0x3188ef10bf8469101d372e6b0960ed2b, 0x02bb74ffa5465b3dda0e353bbc3b6be3, 0x436c4cd167829819ce46024300e24d6d , 0x0739cb3999ae6842528ce5d8ec01a7fc , 0x1b]; // r.low, r.high, s.low, s.high, v
let signature: Array<felt252> = array![0x3188ef10bf8469101d372e6b0960ed2b, 0x02bb74ffa5465b3dda0e353bbc3b6be3, 0x436c4cd167829819ce46024300e24d6d , 0x0739cb3999ae6842528ce5d8ec01a7fc , 0x1b,0x0,0x0]; // r.low, r.high, s.low, s.high, v

let (rosettanet, account) = deploy_account_from_rosettanet(eth_address);

Expand All @@ -71,7 +71,7 @@ fn test_wrong_signature() {
fn test_signature_wrong_address() {
let eth_address: EthAddress = 0xE4306a06B19Fdc04FDf98cF3c00472f29254c0e2.try_into().unwrap();
let unsigned_tx_hash: u256 = 0x105d7b8d7c9fe830c123f2d99c01e09bfa7d902cb3b5afee409cf3dca533f52b;
let signature: Array<felt252> = array![0x3188ef10bf8469101d372e6b0960ed1b, 0x02bb74ffa5465b3dda0e353bbc3b6be3, 0x436c4cd167829819ce46024300e24d6d , 0x0739cb3999ae6842528ce5d8ec01a7fc , 0x1b]; // r.low, r.high, s.low, s.high, v
let signature: Array<felt252> = array![0x3188ef10bf8469101d372e6b0960ed1b, 0x02bb74ffa5465b3dda0e353bbc3b6be3, 0x436c4cd167829819ce46024300e24d6d , 0x0739cb3999ae6842528ce5d8ec01a7fc , 0x1b, 0x0, 0x0]; // r.low, r.high, s.low, s.high, v

let (rosettanet, account) = deploy_account_from_rosettanet(eth_address);

Expand Down

0 comments on commit 64cdce4

Please sign in to comment.