def transfer_presigned(self, params): sp.set_type( params, sp.TRecord(from_=sp.TAddress, to_=sp.TAddress, value=sp.TNat)) params_hash = sp.blake2b(sp.pack(params)) #unsigned = sp.blake2b(mi.operator("SELF; ADDRESS; CHAIN_ID; PAIR; PAIR; PACK", [sp.TPair(sp.TNat, sp.TBytes)], [sp.TBytes])(sp.pair(self.data.counter, params_hash))) permit_key = sp.pair(params.from_, params_hash) effective_expiry = sp.local("effective_expiry", 0) with sp.if_(self.data.permits.contains(permit_key)): permit_submission_timestamp = self.data.permits[permit_key] with sp.if_( self.data.permit_expiries.contains(permit_key) & self.data.permit_expiries[permit_key].is_some()): effective_expiry.value = self.data.permit_expiries[ permit_key].open_some() with sp.else_(): with sp.if_( self.data.user_expiries.contains(params.from_) & self.data.user_expiries[params.from_].is_some()): effective_expiry.value = self.data.user_expiries[ params.from_].open_some() with sp.else_(): effective_expiry.value = self.data.default_expiry # Deleting permit regardless of whether or not its expired with sp.if_( sp.as_nat(sp.now - permit_submission_timestamp) >= effective_expiry.value): # Expired self.delete_permit(permit_key) sp.result(sp.bool(False)) with sp.else_(): self.delete_permit(permit_key) sp.result(sp.bool(True)) with sp.else_(): sp.result(sp.bool(False))
def transfer(self, params): sp.set_type( params, sp.TRecord(from_=sp.TAddress, to_=sp.TAddress, value=sp.TNat)).layout( ("from_ as from", ("to_ as to", "value"))) sender = sp.local("sender", sp.sender) with sp.if_((self.transfer_presigned(params))): # Setting sender.value to from_ so call to transfer_helper will be authorized sender.value = params.from_ sp.verify((sender.value == self.data.administrator) | ( ~self.data.paused & ( (params.from_ == sender.value) | (self.data.balances[ params.from_].approvals[sender.value] >= params.value)))) self.addAddressIfNecessary(params.to_) sp.verify(self.data.balances[params.from_].balance >= params.value) self.data.balances[params.from_].balance = sp.as_nat( self.data.balances[params.from_].balance - params.value) self.data.balances[params.to_].balance += params.value with sp.if_(((params.from_ != sender.value) & (self.data.administrator != sender.value))): self.data.balances[params.from_].approvals[ sender.value] = sp.as_nat( self.data.balances[params.from_].approvals[sender.value] - params.value)
def transderDataToken(self, f, t, token_id): self.data.tokenHolderToID[f].remove(token_id) with sp.if_(~self.data.ownerToBalance.contains(t)): self.data.tokenHolderToID[t] = sp.set() self.data.tokenHolderToID[t].add(token_id) self.data.tokenIdToOwner[token_id] = t self.data.ownerToBalance[f] -= 1 with sp.if_(~self.data.ownerToBalance.contains(t)): self.data.ownerToBalance[t] = 0 self.data.ownerToBalance[t] += 1
def mintDataToken(self,params): sp.verify(sp.sender == self.data.admin) sp.verify(~self.data.tokensMinted.contains(params.token_id)) self.data.tokensMinted.add(params.token_id) with sp.if_(~self.data.ownerToBalance.contains(params.address)): self.data.tokenHolderToID[params.address] = sp.set() self.data.tokenHolderToID[params.address].add(params.token_id) self.data.tokenIdToOwner[params.token_id] = params.address with sp.if_(~self.data.ownerToBalance.contains(params.address)): self.data.ownerToBalance[params.address] = 0 self.data.ownerToBalance[params.address] += 1
def getEffectiveExpiry(self, params): sp.set_type(params, sp.TPair(sp.TAddress, sp.TBytes)) address = sp.fst(params) with sp.if_( self.data.permit_expiries.contains(params) & self.data.permit_expiries[params].is_some()): permit_expiry = self.data.permit_expiries[params].open_some() sp.result(permit_expiry) with sp.else_(): with sp.if_( self.data.user_expiries.contains(address) & self.data.user_expiries[address].is_some()): user_expiry = self.data.user_expiries[address].open_some() sp.result(user_expiry) with sp.else_(): sp.result(self.data.default_expiry)
def setExpiry(self, params): sp.set_type( params, sp.TRecord(address=sp.TAddress, seconds=sp.TNat, permit=sp.TOption(sp.TBytes))).layout( ("address", ("seconds", "permit"))) sp.verify(~self.data.paused) sp.verify(params.seconds <= self.data.max_expiry, "MAX_SECONDS_EXCEEDED") sp.verify_equal(params.address, sp.sender, message="NOT_AUTHORIZED") with sp.if_(params.permit.is_some()): some_permit = params.permit.open_some() sp.verify( self.data.permits.contains(sp.pair(params.address, some_permit)), "PERMIT_NONEXISTENT") permit_submission_timestamp = self.data.permits[sp.pair( params.address, some_permit)] with sp.if_( self.data.permit_expiries.contains( sp.pair(params.address, some_permit)) & self.data.permit_expiries[sp.pair( params.address, some_permit)].is_some()): permit_expiry = self.data.permit_expiries[sp.pair( params.address, some_permit)].open_some() sp.verify( sp.as_nat(sp.now - permit_submission_timestamp) < permit_expiry, "PERMIT_REVOKED") with sp.else_(): with sp.if_( self.data.user_expiries.contains(params.address) & self.data.user_expiries[params.address].is_some()): user_expiry = self.data.user_expiries[ params.address].open_some() sp.verify( sp.as_nat(sp.now - permit_submission_timestamp) < user_expiry, "PERMIT_REVOKED") with sp.else_(): sp.verify( sp.as_nat(sp.now - permit_submission_timestamp) < self.data.default_expiry, "PERMIT_REVOKED") self.data.permit_expiries[sp.pair( params.address, some_permit)] = sp.some(params.seconds) self.data.user_expiries[params.address] = sp.some(params.seconds)
def delete_permit(self, permit_key): sp.set_type(permit_key, sp.TPair(sp.TAddress, sp.TBytes)) with sp.if_(self.data.permits.contains(permit_key)): del self.data.permits[permit_key] with sp.if_(self.data.permit_expiries.contains(permit_key)): del self.data.permit_expiries[permit_key]
def addAddressIfNecessary(self, address): with sp.if_(~self.data.balances.contains(address)): self.data.balances[address] = sp.record(balance=0, approvals={})