예제 #1
0
 def completeBet(self,params):
     uuid = self.data.uuid
     self.data.uuid = self.data.uuid+1
     self.data.tempCompleteBetData[uuid] = sp.record(betId = params.betId,betType=params.betType)
     entryAddress = sp.to_address(sp.self_entry_point(entry_point='completeBetFromOro'))
     contract = sp.contract(sp.TRecord(uuid=sp.TNat,entryAddress=sp.TAddress),self.data.oracleAddress,entry_point="getDataFromOro").open_some()
     sp.transfer(sp.record(uuid=uuid,entryAddress=entryAddress),sp.mutez(5000),contract)
예제 #2
0
 def request_helper(self,
                    amount,
                    job_id,
                    parameters,
                    oracle,
                    waiting_request_id,
                    target,
                    timeout_minutes=5):
     sp.verify(~waiting_request_id.is_some())
     target = sp.set_type_expr(
         target,
         sp.TContract(
             sp.TRecord(client_request_id=sp.TNat, result=value_type)))
     waiting_request_id.set(sp.some(self.data.next_request_id))
     token = sp.contract(sp.TRecord(oracle=sp.TAddress,
                                    params=request_type),
                         self.data.token,
                         entry_point="proxy").open_some()
     params = sp.record(amount=amount,
                        target=sp.to_address(target),
                        job_id=job_id,
                        parameters=parameters,
                        timeout=sp.now.add_minutes(timeout_minutes),
                        client_request_id=self.data.next_request_id)
     sp.transfer(sp.record(oracle=oracle, params=params), sp.mutez(0),
                 token)
     self.data.next_request_id += 1
예제 #3
0
 def request_tokens(self, targets):
     sp.set_type(targets, sp.TSet(sp.TAddress))
     token = sp.contract(self.token_contract.batch_transfer.get_type(),
                         self.data.token,
                         entry_point = "transfer").open_some(message = "Incompatible token interface")
     targets = targets.elements().map(lambda target: sp.record(to_ = target, token_id = 0, amount = self.data.max_amount))
     sp.transfer([sp.record(from_ = sp.to_address(sp.self), txs = targets)], sp.tez(0), token)
예제 #4
0
 def createSealedBidAuctionInstance(self, asset_id, asset_name):
     sp.verify(sp.sender == self.data.master_auction_contract)
     
     contract_address = sp.some(sp.create_contract(
         storage = sp.record(owner = sp.source,
             master_auction_contract = sp.to_address(sp.self),
             asset_id = asset_id,
             # deposit will get seized if participant tries to cheat
             deposit = 0,
             sealed_bids = sp.map(tkey = sp.TAddress, tvalue = sp.TBytes),
             # TODO: maintain revealed_participants list and only refund those
             # possibly split the money b/w highest bidder and owner
             # enforcing all participants to reveal their bids
             # Then there'll be no need to maintain revealed_count & first_revealed
             revealed_count = 0,
             highest_bid = sp.mutez(0),
             highest_bidder = sp.sender,
             started = sp.bool(False),
             first_revealed = sp.bool(False),
             ended = sp.bool(False),
             start_time = sp.now,
             round_time = 0), 
         contract = self.sealed_bid))
     
     # registerInstance
     c = sp.contract(sp.TRecord(asset_id = sp.TNat, contract_address = sp.TAddress),  self.data.master_auction_contract, entry_point = "registerInstance").open_some()
     sp.transfer(sp.record(asset_id = asset_id, contract_address = contract_address.open_some()), sp.mutez(0), c)
예제 #5
0
    def meta_transfer(self, params):
        sp.verify(sp.sender == self.data.administrator)
        sp.set_type(params, BatchMetaTransfer.get_type())

        sp.for meta_transfer in params:
            source_account_key_hash = sp.hash_key(
                meta_transfer.from_public_key)
            source_account = sp.to_address(
                sp.implicit_account(source_account_key_hash))

            sp.verify(self.data.nonces.get(
                source_account, 0)+1 == meta_transfer.nonce)

            packed_data = sp.pack(
                BatchMetaTransfer.get_signing_payload(meta_transfer))

            sp.verify(sp.check_signature(meta_transfer.from_public_key,
                                         meta_transfer.signature, packed_data), message=ErrorMessage.invalid_signature())

            self.data.nonces[source_account] = meta_transfer.nonce

            sp.for tx in meta_transfer.txs:
                from_user = LedgerKey.make(source_account, tx.token_id)
                to_user = LedgerKey.make(tx.to_, tx.token_id)
                sp.verify(tx.amount > 0,
                          message=ErrorMessage.transfer_of_zero())
                sp.verify(self.data.ledger[from_user] >= tx.amount,
                          message=ErrorMessage.insufficient_balance())
                self.data.ledger[from_user] = sp.as_nat(
                    self.data.ledger[from_user] - tx.amount)
                self.data.ledger[to_user] = self.data.ledger.get(
                    to_user, 0) + tx.amount

                sp.if self.data.ledger[from_user] == 0:
                    del self.data.ledger[from_user]
예제 #6
0
 def permit(self, params):
     sp.set_type(
         params,
         sp.TList(sp.TPair(sp.TKey, sp.TPair(sp.TSignature, sp.TBytes))))
     sp.verify(~self.data.paused)
     with sp.for_('permit', params) as permit:
         params_hash = sp.snd(sp.snd(permit))
         unsigned = sp.pack(
             sp.pair(sp.pair(sp.chain_id, sp.self_address),
                     sp.pair(self.data.counter, params_hash)))
         pk_address = sp.to_address(
             sp.implicit_account(sp.hash_key(sp.fst(permit))))
         permit_key = sp.pair(pk_address, params_hash)
         permit_exists = self.data.permits.contains(permit_key)
         effective_expiry = self.getEffectiveExpiry(
             sp.pair(pk_address, params_hash))
         permit_submission_timestamp = self.data.permits[permit_key]
         sp.verify(
             ~(permit_exists &
               (sp.as_nat(sp.now - permit_submission_timestamp) <
                effective_expiry)), sp.pair("DUP_PERMIT", params_hash))
         sp.verify(
             sp.check_signature(sp.fst(permit), sp.fst(sp.snd(permit)),
                                unsigned), sp.pair("MISSIGNED", unsigned))
         self.data.permits[sp.pair(pk_address, params_hash)] = sp.now
         self.data.counter = self.data.counter + 1
예제 #7
0
 def collect(self, params):
     sp.verify(params.objkt_amount > 0)
     self.fa2_transfer(self.data.ung, sp.sender, self.data.swaps[params.swap_id].issuer, 1, self.data.swaps[params.swap_id].ung_per_objkt * params.objkt_amount)
     self.fa2_transfer(self.data.objkt, sp.to_address(sp.self), sp.sender, self.data.swaps[params.swap_id].objkt_id, params.objkt_amount)
     self.data.swaps[params.swap_id].objkt_id = abs(self.data.swaps[params.swap_id].objkt_id - params.objkt_amount)
     
     sp.if (self.data.swaps[params.swap_id].objkt_amount == 0):
         del self.data.swaps[params.swap_id]
예제 #8
0
 def placeBet(self,params):
     sp.verify(self.data.betData.contains(params.betType), message="incorrect bet type")
     sp.verify_equal(sp.amount,sp.mutez(self.data.betSize[params.betType]),message="incorrect amount sent to the entry point")
     # multiplied seed by 10000 to retain last 6 digits of timestamp
     uuid = self.data.uuid
     self.data.uuid = self.data.uuid+1
     self.data.tempData[uuid] = sp.record(seed=params.seed,sender=sp.sender,betType=params.betType)
     entryAddress = sp.to_address(sp.self_entry_point(entry_point='placeBetFromOro'))
     contract = sp.contract(sp.TRecord(uuid=sp.TNat,entryAddress=sp.TAddress),self.data.oracleAddress,entry_point="getDataFromOro").open_some()
     sp.transfer(sp.record(uuid=uuid,entryAddress=entryAddress),sp.mutez(5000),contract)
예제 #9
0
파일: consumer.py 프로젝트: sonemas/pire
 def sendQuery(self, params):
     handler = sp.contract(qType, self.data.oracle,
                           entry_point="makeQuery").open_some()
     args = sp.record(
         # id = params.id,
         jurisdiction=params.jurisdiction,
         companyNumber=params.companyNumber,
         callback=sp.record(address=sp.to_address(sp.self),
                            entryPoint="receiveAnswer")
         #sp.contract(rType, sp.to_address(sp.self), entry_point = "receiveAnswer").open_some()
     )
     sp.transfer(args, sp.tez(0), handler)
예제 #10
0
 def cancel_request(self, client_request_id):
     # We do not want to check active here (it would be bad for the client).
     # sp.sender needs to be validated; this process is done through the use of the reverse_request_key.
     reverse_request_key = sp.compute(sp.record(client = sp.sender, client_request_id = client_request_id))
     request_id = sp.local('request_id', self.data.reverse_requests[reverse_request_key]).value
     request = sp.local('request', self.data.requests[request_id]).value
     sp.verify(request.timeout <= sp.now, message = "TTL not met")
     token = sp.contract(self.token_contract.batch_transfer.get_type(), self.data.token, entry_point = "transfer").open_some(message = "Incompatible token interface")
     sp.transfer([sp.record(from_ = sp.to_address(sp.self), txs = [sp.record(to_ = request.client, token_id = 0, amount = request.amount)])],
                 sp.tez(0),
                 token)
     del self.data.requests[request_id]
     del self.data.reverse_requests[reverse_request_key]
예제 #11
0
 def fulfill_request(self, request_id, result):
     # Please note that the target (i.e., the requestor) could refuse to receive the data.
     # We do not want to check active here since sp.sender == admin.
     sp.verify(self.data.admin == sp.sender, message = "Privileged operation")
     request = sp.local('request', self.data.requests[request_id]).value
     token = sp.contract(self.token_contract.batch_transfer.get_type(), self.data.token, entry_point = "transfer").open_some(message = "Incompatible token interface")
     sp.transfer([sp.record(from_ = sp.to_address(sp.self), txs = [sp.record(to_ = self.data.admin, token_id = 0, amount = request.amount)])],
                 sp.tez(0),
                 token)
     target = sp.contract(sp.TRecord(client_request_id = sp.TNat, result = value_type), request.target).open_some(message = "Incompatible client interface")
     sp.transfer(sp.record(client_request_id = request.client_request_id, result = result), sp.mutez(0), target)
     del self.data.requests[request_id]
     reverse_request_key = sp.record(client = request.client, client_request_id = request.client_request_id)
     del self.data.reverse_requests[reverse_request_key]
예제 #12
0
 def createDutchAuctionInstance(self, asset_id, asset_name):
     contract_address = sp.create_contract(
         storage = sp.record(owner = sp.sender,
             master_auction_contract = sp.to_address(sp.self),
             asset_id = asset_id,
             current_price = 0,
             reserve_price = 0,
             started = sp.bool(False),
             ended = sp.bool(False),
             start_time = sp.now,
             wait_time = 0), 
         contract = self.dutch)
     self.data.instances_map[asset_id] = sp.record(
         asset_name = asset_name,
         auction_type = "dutch",
         owner = sp.sender,
         contract_address = contract_address,
         is_available = sp.bool(True))
예제 #13
0
    def getAddressInfoFromRegistry(self, params):
        # type of response
        tkResponse = sp.TRecord(
            name = sp.TString,
            info = sp.TRecord(
                name = sp.TString, 
                owner = sp.TAddress,
                resolver = sp.TAddress, 
                registeredAt = sp.TTimestamp,
                registrationPeriod = sp.TInt,
                modified = sp.TBool))
        # callback handle for the receiver entrypoint
        kResponse = sp.contract(tkResponse, sp.to_address(sp.self), entry_point = "recvAddressInfo").open_some()
        
        # type of request
        tkRequest = sp.TRecord(addr = sp.TAddress, k = sp.TContract(tkResponse))
        kRequest = sp.contract(tkRequest, self.data.registry, entry_point = "sendAddressInfo").open_some()

        sp.transfer(sp.record(addr = params.addr, k = kResponse), sp.mutez(0), kRequest)
예제 #14
0
 def createEnglishAuctionInstance(self, asset_id, asset_name):
     contract_address = sp.some(sp.create_contract(
         storage = sp.record(owner = sp.sender,
             master_auction_contract = sp.to_address(sp.self),
             asset_id = asset_id,
             current_bid = sp.mutez(0),
             min_increase = 0,
             highest_bidder = sp.sender,
             started = sp.bool(False),
             ended = sp.bool(False),
             start_time = sp.now,
             wait_time = 0), 
         contract = self.english))
     self.data.instances_map[asset_id] = sp.record(
         asset_name = asset_name,
         auction_type = "english",
         owner = sp.sender,
         contract_address = contract_address.open_some(),
         is_available = sp.bool(True))
예제 #15
0
 def permit(self, params):
     sp.set_type(params, sp.TList(
         sp.TPair(sp.TKey, sp.TPair(sp.TSignature, sp.TBytes))))
     sp.for permit in params:
         public_key = sp.fst(permit)
         signature = sp.fst(sp.snd(permit))
         params_hash = sp.snd(sp.snd(permit))
         #unsigned = sp.blake2b(mi.operator("SELF; ADDRESS; CHAIN_ID; PAIR; PAIR; PACK", [sp.TPair(sp.TNat, sp.TBytes)], [sp.TBytes])(sp.pair(self.data.permit_data.counter, params_hash)))
         unsigned = sp.pack(sp.pair(sp.pair(sp.chain_id, sp.self_address), sp.pair(
             self.data.permit_data.counter, params_hash)))
         pk_address = sp.to_address(
             sp.implicit_account(sp.hash_key(public_key)))
         permit_key = sp.pair(pk_address, params_hash)
         permit_exists = self.data.permit_data.permits.contains(permit_key)
         permit_submission_timestamp = self.data.permit_data.permits[permit_key]
         effective_expiry = self.getEffectiveExpiry(permit_key)
         sp.verify(~ (permit_exists & (sp.as_nat(sp.now - permit_submission_timestamp) < effective_expiry)),
             sp.pair(self.error_message.duplicate_permit(), params_hash))
         sp.verify(sp.check_signature(public_key, signature, unsigned), sp.pair(self.error_message.permit_missigned(), unsigned))
         self.data.permit_data.permits[permit_key] = sp.now
         self.data.permit_data.counter = self.data.permit_data.counter + 1
예제 #16
0
    def buy_powerup(self, powerup):

        # modify data_type to also hold another variable called cryptobot_address.
        data_type = sp.TRecord(powerup=sp.TString, cryptobot_contract=sp.TContract(
            sp.TRecord(power=sp.TString, duration=sp.TNat)))

        market_contract = sp.contract(
            data_type, self.data.market_address).open_some()
        self.data.mutez_points -= sp.mutez(3000)

        # define self_contract -
        # 1. Accepts a record with two variables - power(string), duration(nat)
        # 2. Points to the Cryptobot( use sp.to_address() )
        # 3. Specifies receive_powerup entry point
        self_contract = sp.contract(sp.TRecord(power=sp.TString, duration=sp.TNat), sp.to_address(
            sp.self), "receive_powerup").open_some()

        # modify data_to_be_sent to also hold cryptobot_contract which is assigned self_contract
        data_to_be_sent = sp.record(
            powerup=powerup, cryptobot_contract=self_contract)
        sp.transfer(data_to_be_sent, sp.mutez(0), market_contract)
예제 #17
0
    def sendQuery(self, params):
        rtype = sp.TRecord(
                currencyPair = sp.TString,
                value = sp.TNat,
                precision = sp.TNat,
                timestamp = sp.TTimestamp,
                source = sp.TString)
        ptype = sp.TRecord(
            currencyPair = sp.TString,
            callback = sp.TContract(rtype)
        )

        getHandle = sp.contract(ptype, self.data.oracle, entry_point = "processDataRequest").open_some()

        args = sp.record(
            currencyPair = params.currencyPair,
            callback = sp.contract(rtype,
                            sp.to_address(sp.self),
                            entry_point = "receiveData").open_some()
            )
        sp.transfer(args, sp.tez(1000), getHandle)
예제 #18
0
 def __init__(self,
              feeRate: sp.TNat,
              tokenAddress: sp.TAddress,
              factoryAddress: sp.TAddress,
              delegated: sp.TKeyHash):
     self.init(
         feeRate=sp.nat(feeRate),
         tezPool=sp.mutez(0),
         tokenPool=sp.nat(0),
         invariant=sp.mutez(0),
         totalShares=sp.nat(0),
         tokenAddress=tokenAddress,
         factoryAddress=factoryAddress,
         # sp.TAddress, sp.TNat
         shares=sp.big_map(tkey=sp.TAddress, tvalue=sp.TNat),
         # sp.TAddress, sp.TKeyHash
         candidates=sp.big_map(tkey=sp.TAddress, tvalue=sp.TKeyHash),
         # sp.TKeyHash, sp.TNat
         votes=sp.big_map(tkey=sp.TKeyHash, tvalue=sp.TNat),
         delegated=delegated,
         address=tokenAddress
     )
     self.data.address = sp.to_address(sp.self)
예제 #19
0
 def cancel_swap(self, params):
     sp.verify( (self.data.swaps[params].issuer == sp.sender) )
     self.fa2_transfer(self.data.objkt, sp.to_address(sp.self), sp.sender, self.data.swaps[params].objkt_id, self.data.swaps[params].objkt_amount)
     
     del self.data.swaps[params]
예제 #20
0
 def swap(self, params):
     sp.verify((params.objkt_amount > 0))
     self.fa2_transfer(self.data.objkt, sp.sender, sp.to_address(sp.self), params.objkt_id, params.objkt_amount)
     self.data.swaps[self.data.swap_id] = sp.record(issuer=sp.sender, objkt_id=params.objkt_id, objkt_amount=params.objkt_amount, xtz_per_objkt=params.xtz_per_objkt)
     self.data.swap_id += 1
예제 #21
0
class OBJKTSwap(sp.Contract):
    def __init__(self, objkt, hdao, manager, metadata, curate):
        self.fee = 0
        self.amount = 0
        self.royalties = 0
        self.init(
            swaps = sp.big_map(tkey=sp.TNat, tvalue=sp.TRecord(issuer=sp.TAddress, xtz_per_objkt=sp.TMutez, objkt_id=sp.TNat, objkt_amount=sp.TNat)),
            royalties = sp.big_map(tkey=sp.TNat, tvalue=sp.TRecord(issuer=sp.TAddress, royalties=sp.TNat)),
            swap_id = 0,
            objkt_id = 152,
            objkt = objkt,
            hdao = hdao,
            manager = manager,
            metadata = metadata,
            genesis = sp.timestamp(0),
            curate = curate,
            locked = False
            )
    
    @sp.entry_point
    def genesis(self):
        sp.verify((sp.sender == self.data.manager) & ~(self.data.locked))
        self.data.genesis = (sp.now).add_days(45)
        self.data.locked = True
    
    @sp.entry_point
    def update_manager(self, params):
        sp.verify(sp.sender == self.data.manager)
        self.data.manager = params
        
    @sp.entry_point
    def swap(self, params):
        sp.verify((params.objkt_amount > 0))
        self.fa2_transfer(self.data.objkt, sp.sender, sp.to_address(sp.self), params.objkt_id, params.objkt_amount)
        self.data.swaps[self.data.swap_id] = sp.record(issuer=sp.sender, objkt_id=params.objkt_id, objkt_amount=params.objkt_amount, xtz_per_objkt=params.xtz_per_objkt)
        self.data.swap_id += 1
    
    @sp.entry_point
    def cancel_swap(self, params):
        sp.verify( (self.data.swaps[params].issuer == sp.sender) )
        self.fa2_transfer(self.data.objkt, sp.to_address(sp.self), sp.sender, self.data.swaps[params].objkt_id, self.data.swaps[params].objkt_amount)
        
        del self.data.swaps[params]
        
    @sp.entry_point
    def collect(self, params):
        sp.verify( (params.objkt_amount > 0) & (sp.sender != self.data.swaps[params.swap_id].issuer) )
        
        sp.if (self.data.swaps[params.swap_id].xtz_per_objkt != sp.tez(0)):
        
            self.objkt_amount = sp.fst(sp.ediv(sp.amount, self.data.swaps[params.swap_id].xtz_per_objkt).open_some())
            
            self.amount = self.objkt_amount * sp.fst(sp.ediv(self.data.swaps[params.swap_id].xtz_per_objkt, sp.mutez(1)).open_some())
            
            sp.verify((params.objkt_amount == self.objkt_amount) & (sp.amount == sp.utils.nat_to_mutez(self.amount)) & (sp.amount > sp.tez(0)))
            # calculate fees and royalties
            self.fee = sp.fst(sp.ediv(sp.utils.nat_to_mutez(self.amount), sp.utils.nat_to_mutez(1)).open_some()) * (self.data.royalties[self.data.swaps[params.swap_id].objkt_id].royalties + 25) / 1000
            self.royalties = self.data.royalties[self.data.swaps[params.swap_id].objkt_id].royalties * self.fee / (self.data.royalties[self.data.swaps[params.swap_id].objkt_id].royalties + 25)
            
            # send royalties to NFT creator
            sp.send(self.data.royalties[self.data.swaps[params.swap_id].objkt_id].issuer, sp.utils.nat_to_mutez(self.royalties))
            
            # send management fees
            sp.send(self.data.manager, sp.utils.nat_to_mutez(abs(self.fee - self.royalties)))
            
            # send value to issuer
            sp.send(self.data.swaps[params.swap_id].issuer, sp.amount - sp.utils.nat_to_mutez(self.fee))
            
            # off on test scenarios
            # sp.if (sp.now < self.data.genesis):
            #self.mint_hDAO([sp.record(to_=sp.sender, amount=self.amount / 2), sp.record(to_=self.data.swaps[params.swap_id].issuer, amount=self.amount / 2), sp.record(to_=self.data.manager, amount=abs(self.fee - self.royalties))])
        
        self.fa2_transfer(self.data.objkt, sp.to_address(sp.self), sp.sender, self.data.swaps[params.swap_id].objkt_id, params.objkt_amount)

        self.data.swaps[params.swap_id].objkt_amount = abs(self.data.swaps[params.swap_id].objkt_amount - params.objkt_amount)
        
        sp.if (self.data.swaps[params.swap_id].objkt_amount == 0):
            del self.data.swaps[params.swap_id]
예제 #22
0
 def token_metadata_registry(self, params):
     sp.verify(~self.data.paused)
     sp.set_type(params, sp.TContract(sp.TAddress))
     sp.transfer(sp.to_address(sp.self), sp.mutez(0), params)
예제 #23
0
 asset_id = sp.local('asset_id', params.asset_id)
 asset_name = sp.local('asset_name', params.asset_name)
 
 sp.if asset_id.value == 0:
     asset_id.value = self.data.counter
     self.data.counter = self.data.counter + 1
 sp.else:
     sp.verify((self.data.instances_map[asset_id.value].owner == sp.sender))
     sp.verify((self.data.instances_map[asset_id.value].is_available), "cannot auction as the asset is unavailable")
     asset_name.value = self.data.instances_map[asset_id.value].asset_name
 
 self.data.instances_map[asset_id.value] = sp.record(
     asset_name = asset_name.value,
     auction_type = params.auction_type,
     owner = sp.sender,
     contract_address = sp.to_address(sp.self),
     is_available = sp.bool(True))
 
 sp.verify(((params.auction_type == "english") | (params.auction_type == "dutch") | (params.auction_type == "sealed bid")), "incorrect auction_type")
 sp.if params.auction_type == "dutch":
     d = sp.contract(sp.TNat, self.data.dutch_factory, entry_point = "createDutchAuctionInstance").open_some()
     sp.transfer(asset_id.value, sp.mutez(0), d)
 sp.if params.auction_type == "english":
     e = sp.contract(sp.TNat, self.data.english_factory, entry_point = "createEnglishAuctionInstance").open_some()
     sp.transfer(asset_id.value, sp.mutez(0), e)        
 sp.if params.auction_type == "sealed bid":
     s = sp.contract(sp.TNat, self.data.sealed_bid_factory, entry_point = "createSealedBidAuctionInstance").open_some()
     sp.transfer(asset_id.value, sp.mutez(0), s)
 sp.if params.auction_type == "vickrey":
     v = sp.contract(sp.TNat, self.data.vickrey_factory, entry_point = "createVickreyAuctionInstance").open_some()
     sp.transfer(asset_id.value, sp.mutez(0), v)        
 def transfer(self, params):
     arg = sp.TRecord(fro = sp.TAddress, to = sp.TAddress, value = sp.TNat)
     arg_inst = sp.record(fro = sp.to_address(sp.self), to = params, value = self.data.tk_amount)
     c = sp.contract(arg, self.data.fa12, entry_point="transfer").open_some()
     
     sp.transfer(arg_inst, sp.mutez(0), c)
예제 #25
0
 def leave_hDAO(self, params):
     #sp.verify( self.data.auth.get(sp.sender, False ) )
     self.fa2_transfer(self.data.ung, sp.sender, sp.to_address(sp.self), 1, params)
     sp.send(sp.sender, sp.mutez(params))
     self.data.balance -= sp.mutez(params)