Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- auto sb = ScriptBuilder::BeginScript()
- .AllowGas(gasWallet, Address(), MinimumGasFee, 1500 + 500 * itemIds.size() + item.failures * 1000 + item.valueTTRS.size() * 500);
- for( int64_t itemId : itemIds )
- {
- GOATiNftType type = TypeFromItemId(itemId);
- const Byte* extraData = 0;
- int extraDataSize = 0;
- int64_t salt;
- if( GOATiNftType::Crate == type )
- {
- salt = crateSecrets.back().salt;
- extraData = crateSecrets.back().data;
- extraDataSize = CrateSecret::LENGTH;
- }
- else
- {
- salt = RandomSeed64();
- if( GOATiNftType::License == type )
- {
- extraData = &licenses.back().front();
- extraDataSize = (int)licenses.back().size();
- }
- }
- auto stateId = mintingState.nftMintingStateId.find(itemId);
- if( stateId == mintingState.nftMintingStateId.end() )
- {
- TxLog(item.txHash, "\tCan't find minting state for NFT (%d)!", (int)itemId);
- return {};
- }
- TxLog(item.txHash, "\tPurchasing NFT (%d)", (int)itemId);
- eiASSERT( itemId >= 0 );
- MintItem(sb, tokenWallet, customer, itemId, stateId->second,
- GOATiNftMintingSource::Store,
- storeSource,
- GOATiNftSeason::PreSeason, item.txTimestamp, salt, extraData, extraDataSize);
- if( GOATiNftType::Crate == type )
- crateSecrets.pop_back();
- if( GOATiNftType::License == type )
- licenses.pop_back();
- }
- for( int64_t itemId : bundles )
- {//Update the "minted" counter for the bundles that were purchased
- auto stateId = mintingState.nftMintingStateId.find(itemId);
- if( stateId == mintingState.nftMintingStateId.end() )
- {
- TxLog(item.txHash, "\tCan't find minting state for NFT (%d)!", (int)itemId);
- return {};
- }
- IncrementRAM(sb, String("TTRS"), stateId->second);
- }
- if( hasReferral )
- {//Mint the referral bonus
- sb
- .MintTokens(rde::string("GOATI"), tokenWallet, customer, referralBonusGOATI)
- .MintTokens(rde::string("GOATI"), tokenWallet, cart.referrer, referralBonusGOATI);
- }
- if( hasRevenueInGOATi )
- {// destroy any GOATI being earned by the auction/shop wallet, and move the prize pool split out
- sb.BurnTokens(shop, rde::string("GOATI"), revenueGOATI);
- sb.TransferTokens(rde::string("GOATI"), shop, keys.prizePool, prizePoolGOATI);
- }
- if( hasRevenueInSoul )
- {// move our revenue out of the auction/shop wallet
- sb.TransferTokens(rde::string("SOUL"), shop, keys.stash.Address(), revenueSOUL);
- sb.TransferTokens(rde::string("SOUL"), shop, keys.prizePool, prizePoolSOUL);
- }
- if( hasRefundInSoul )
- {
- sb.TransferTokens(rde::string("SOUL"), shop, customer, cart.refundInSOUL);
- }
- if( hasRefundInGOATi )
- {
- sb.TransferTokens(rde::string("GOATI"), shop, customer, cart.refundInGOATI);
- }
- if( openingCrate )
- {
- //Write the audit trail into the now-opened crates before burning them
- eiASSERT( cart.fromCrate.size() == cart.openCrateRam.size() );
- for( int i=0, end=cart.fromCrate.size(); i!=end; ++i )
- {
- const BigInteger& crateId = cart.fromCrate[i];
- sb.WriteToken(rde::string("TTRS"), crateId, cart.openCrateRam[i]);
- sb.BurnToken(shop, rde::string("TTRS"), crateId);
- }
- for( int i=0, end=cart.returnItems.size(); i!=end; ++i )
- {
- const BigInteger& crateId = cart.returnItems[i];
- sb.TransferToken(rde::string("TTRS"), shop, customer, crateId);
- }
- }
- else
- {
- eiASSERT( cart.returnItems.empty() );
- for( const auto& id : item.valueTTRS )
- {//return any items they sent us - wtf
- sb.TransferToken(rde::string("TTRS"), shop, customer, id);
- }
- }
- auto script = sb
- .SpendGas(gasWallet)
- .EndScript();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement