@ -31,9 +31,12 @@
extern std : : string ASSETCHAINS_SELFIMPORT ;
extern uint16_t ASSETCHAINS_CODAPORT , ASSETCHAINS_BEAMPORT ;
int32_t komodo_nextheight ( ) ;
int32_t GetSelfimportProof ( TxProof & proof , CTransaction burnT x, uint256 hash ) // find burnTx with hash from "other" daemon
int32_t GetSelfimportProof ( CMutableTransaction & mtx , CScript & scriptPubKey , TxProof & proof , uint64_t burnAmount , std : : vector < uint8_t > rawt x, uint256 hash , std : : vector < uint8_t > rawproof ) // find burnTx with hash from "other" daemon
{
MerkleBranch newBranch ; CMutableTransaction & tmpmtx ; CTransaction tx , vintx ; uint256 blockHash ; char destaddr [ 64 ] , pkaddr [ 64 ] ;
tmpmtx = CreateNewContextualCMutableTransaction ( Params ( ) . GetConsensus ( ) , komodo_nextheight ( ) ) ;
if ( ASSETCHAINS_SELFIMPORT = = " BEAM " )
{
// confirm via ASSETCHAINS_BEAMPORT that burnTx/hash is a valid BEAM burn
@ -44,15 +47,45 @@ int32_t GetSelfimportProof(TxProof &proof,CTransaction burnTx,uint256 hash) // f
// confirm via ASSETCHAINS_CODAPORT that burnTx/hash is a valid CODA burn
return ( - 1 ) ;
}
else if ( ASSETCHAINS_SELFIMPORT = = " PUBKEY " )
else
{
// make sure vin0 is signed by ASSETCHAINS_OVERRIDE_PUBKEY33
return ( 0 ) ;
}
else if ( ASSETCHAINS_SELFIMPORT = = " GATEWAY " )
{
// external coin is the assetchains symbol in the burnTx OP_RETURN
if ( ! E_UNMARSHAL ( rawtx , ss > > tx ) )
return ( - 1 ) ;
scriptPubKey = tx . vout [ 0 ] . scriptPubKey ;
mtx = tx ;
mtx . fOverwintered = tmptx . fOverwintered ;
mtx . nExpiryHeight = tmptx . nExpiryHeight ;
mtx . nVersionGroupId = tmptx . nVersionGroupId ;
mtx . nVersion = tmptx . nVersion ;
mtx . vout . clear ( ) ;
mtx . vout . resize ( 1 ) ;
mtx . vout [ 0 ] . nValue = burnAmount ;
mtx . vout [ 0 ] . scriptPubKey = scriptPubKey ;
if ( tx . GetHash ( ) ! = txid )
return ( - 1 ) ;
if ( ASSETCHAINS_SELFIMPORT = = " PUBKEY " )
{
// make sure vin0 is signed by ASSETCHAINS_OVERRIDE_PUBKEY33
if ( GetTransaction ( tx . vin [ 0 ] . prevout , vintx , blockHash , false ) = = 0 )
return ( - 1 ) ;
if ( tx . vin [ 0 ] . prevn < vintx . vout . size ( ) & & Getscriptaddress ( destaddr , vintx . vout [ tx . vin [ 0 ] . prevn ] . scriptPubKey ) ! = 0 )
{
pubkey2addr ( pkaddr , ASSETCHAINS_OVERRIDE_PUBKEY33 . data ( ) ) ;
if ( strcmp ( pkaddr , destaddr ) = = 0 )
{
proof = std : : make_pair ( txid , newBranch ) ;
return ( 0 ) ;
}
fprintf ( stderr , " vin0[%d] -> %s vs %s \n " , tx . vin [ 0 ] . prevn , destaddr , pkaddr ) ;
}
return ( - 1 ) ;
}
else
{
// ASSETCHAINS_SELFIMPORT and external coin is the assetchains symbol in the burnTx OP_RETURN
// burnAmount, rawtx and rawproof should be enough for gatewaysdeposit equivalent
return ( - 1 ) ;
}
}
else return ( - 1 ) ;
return ( 0 ) ;
@ -81,20 +114,18 @@ int32_t CheckGATEWAYimport(std::string coin,TxProof proof,CTransaction burnTx,st
int32_t CheckPUBKEYimport ( TxProof proof , CTransaction burnTx , std : : vector < CTxOut > payouts )
{
// if burnTx has ASSETCHAINS_PUBKEY vin, it is valid return(0);
fprintf ( stderr , " proof txid.%s \n " , proof . first . GetHex ( ) . ToString ( ) . c_str ( ) ) ;
return ( 0 ) ;
return ( - 1 ) ;
}
bool Eval : : ImportCoin ( const std : : vector < uint8_t > params , const CTransaction & importTx , unsigned int nIn )
bool Eval : : ImportCoin ( const std : : vector < uint8_t > params , const CTransaction & importTx , unsigned int nIn )
{
TxProof proof ; CTransaction burnTx ; std : : vector < CTxOut > payouts ; uint64_t txfee = 10000 ;
uint32_t targetCcid ; std : : string targetSymbol ; uint256 payoutsHash ;
if ( importTx . vout . size ( ) < 2 )
return Invalid ( " too-few-vouts " ) ;
// params
TxProof proof ;
CTransaction burnTx ;
std : : vector < CTxOut > payouts ;
if ( ! UnmarshalImportTx ( importTx , proof , burnTx , payouts ) )
return Invalid ( " invalid-params " ) ;
@ -102,15 +133,9 @@ bool Eval::ImportCoin(const std::vector<uint8_t> params, const CTransaction &imp
// It should not be at all malleable
if ( MakeImportCoinTransaction ( proof , burnTx , payouts ) . GetHash ( ) ! = importTx . GetHash ( ) )
return Invalid ( " non-canonical " ) ;
// burn params
uint32_t targetCcid ;
std : : string targetSymbol ;
uint256 payoutsHash ;
if ( ! UnmarshalBurnTx ( burnTx , targetSymbol , & targetCcid , payoutsHash ) )
return Invalid ( " invalid-burn-tx " ) ;
// check burn amount
{
uint64_t burnAmount = burnTx . vout . back ( ) . nValue ;
@ -119,27 +144,24 @@ bool Eval::ImportCoin(const std::vector<uint8_t> params, const CTransaction &imp
uint64_t totalOut = 0 ;
for ( int i = 0 ; i < importTx . vout . size ( ) ; i + + )
totalOut + = importTx . vout [ i ] . nValue ;
if ( totalOut > burnAmount )
if ( totalOut > burnAmount | | totalOut < burnAmount - txfee )
return Invalid ( " payout-too-high " ) ;
}
// Check burntx shows correct outputs hash
if ( payoutsHash ! = SerializeHash ( payouts ) )
return Invalid ( " wrong-payouts " ) ;
if ( targetCcid < KOMODO_FIRSTFUNGIBLEID )
return Invalid ( " chain-not-fungible " ) ;
// Check proof confirms existance of burnTx
if ( targetCcid ! = 0xffffffff )
{
if ( targetCcid ! = GetAssetchainsCC ( ) | | targetSymbol ! = GetAssetchainsSymbol ( ) )
if ( targetCcid ! = GetAssetchainsCC ( ) | | targetSymbol ! = GetAssetchainsSymbol ( ) )
return Invalid ( " importcoin-wrong-chain " ) ;
uint256 target = proof . second . Exec ( burnTx . GetHash ( ) ) ;
if ( ! CheckMoMoM ( proof . first , target ) )
return Invalid ( " momom-check-fail " ) ;
}
else if ( ASSETCHAINS_SELFIMPORT = = targetSymbol | | ASSETCHAINS_SELFIMPORT = = " GATEWAY " ) // various selfchain imports
else if ( ASSETCHAINS_SELFIMPORT = = targetSymbol ) // various selfchain imports
{
if ( ASSETCHAINS_SELFIMPORT = = " BEAM " )
{
@ -158,7 +180,7 @@ bool Eval::ImportCoin(const std::vector<uint8_t> params, const CTransaction &imp
}
else
{
if ( CheckGATEWAYimport ( GetAssetchainsSymbol ( ) , proof , burnTx , payouts ) < 0 )
if ( CheckGATEWAYimport ( targetSymbol , proof , burnTx , payouts ) < 0 )
return Invalid ( " GATEWAY-import-failure " ) ;
}
}