Browse Source

Verify Alice ETH/ERC20 fee amount.

patch-3
Artem Pikulin 7 years ago
parent
commit
9e2a43d029
  1. 25
      iguana/exchanges/LP_etomic.c
  2. 2
      iguana/exchanges/LP_transaction.c
  3. 31
      iguana/exchanges/etomicswap/etomiclib.cpp
  4. 3
      iguana/exchanges/etomicswap/etomiclib.h

25
iguana/exchanges/LP_etomic.c

@ -61,6 +61,31 @@ char *LP_etomicalice_send_fee(struct basilisk_swap *swap)
}
}
uint8_t LP_etomic_verify_alice_fee(struct basilisk_swap *swap)
{
EthTxData data = getEthTxData(swap->otherfee.I.ethTxid);
if (data.exists == 0 || strcmp(data.from, swap->I.etomicdest) != 0) {
return 0;
}
if ( strcmp(swap->I.alicestr,"ETH") == 0 )
{
uint64_t txValue = weiToSatoshi(data.valueHex);
if (strcmp(data.to, ETH_FEE_ACCEPTOR) != 0 || txValue != swap->otherfee.I.amount) {
return(0);
}
return(1);
}
else
{
if (strcmp(data.to, swap->I.alicetomic) != 0) {
return(0);
}
char weiAmount[70];
satoshisToWei(weiAmount, swap->otherfee.I.amount);
return(verifyAliceErc20FeeData(ETH_FEE_ACCEPTOR, weiAmount, data.input));
}
}
char *LP_etomicalice_send_payment(struct basilisk_swap *swap)
{
AliceSendsEthPaymentInput input; AliceSendsErc20PaymentInput input20; BasicTxData txData;

2
iguana/exchanges/LP_transaction.c

@ -2133,7 +2133,7 @@ int32_t LP_verify_otherfee(struct basilisk_swap *swap,uint8_t *data,int32_t data
else printf("locktime mismatch in otherfee, reject %u vs %u\n",swap->otherfee.I.locktime,swap->I.started+1);
#ifndef NOTETOMIC
if (swap->otherfee.I.ethTxid[0] != 0 && LP_etomic_is_empty_tx_id(swap->otherfee.I.ethTxid) == 0) {
if (LP_etomic_wait_for_confirmation(swap->otherfee.I.ethTxid) < 0) {
if (LP_etomic_wait_for_confirmation(swap->otherfee.I.ethTxid) < 0 || LP_etomic_verify_alice_fee(swap) == 0) {
return(-1);
}
}

31
iguana/exchanges/etomicswap/etomiclib.cpp

@ -498,6 +498,12 @@ void satoshisToWei(char *dest, uint64_t input)
strcat(dest, "0000000000");
}
uint64_t weiToSatoshi(char *wei)
{
u256 satoshi = jsToU256(wei) / exp10<10>();
return static_cast<uint64_t>(satoshi);
}
char *sendEth(char *to, char *amount, char *privKey)
{
TransactionSkeleton tx;
@ -516,6 +522,16 @@ char *sendEth(char *to, char *amount, char *privKey)
return result;
}
std::stringstream getErc20TransferData(char *to, char *amount)
{
std::stringstream ss;
ss << "0xa9059cbb"
<< "000000000000000000000000"
<< toHex(jsToAddress(to))
<< toHex(toBigEndian(jsToU256(amount)));
return ss;
}
char *sendErc20(char *tokenAddress, char *to, char *amount, char *privKey)
{
TransactionSkeleton tx;
@ -528,11 +544,7 @@ char *sendErc20(char *tokenAddress, char *to, char *amount, char *privKey)
tx.nonce = getNonce(from);
free(from);
std::stringstream ss;
ss << "0xa9059cbb"
<< "000000000000000000000000"
<< toHex(jsToAddress(to))
<< toHex(toBigEndian(jsToU256(amount)));
std::stringstream ss = getErc20TransferData(to, amount);
tx.data = jsToBytes(ss.str());
char *rawTx = signTx(tx, privKey);
@ -540,3 +552,12 @@ char *sendErc20(char *tokenAddress, char *to, char *amount, char *privKey)
free(rawTx);
return result;
}
uint8_t verifyAliceErc20FeeData(char *to, char *amount, char *data)
{
std::stringstream ss = getErc20TransferData(to, amount);
if (strcmp(ss.str().c_str(), data) != 0) {
return 0;
}
return 1;
}

3
iguana/exchanges/etomicswap/etomiclib.h

@ -180,9 +180,12 @@ uint64_t getErc20Allowance(char *owner, char *spender, char *tokenAddress);
void uint8arrayToHex(char *dest, uint8_t *input, int len);
void satoshisToWei(char *dest, uint64_t input);
uint64_t weiToSatoshi(char *wei);
char *sendEth(char *to, char *amount, char *privKey);
char *sendErc20(char *tokenAddress, char *to, char *amount, char *privKey);
uint8_t verifyAliceErc20FeeData(char *to, char *amount, char *data);
// Your prototype or Definition
#ifdef __cplusplus
}

Loading…
Cancel
Save