Add maker selects fidelity bond size

This commit is contained in:
Reckless_Satoshi 2022-03-18 15:09:38 -07:00
parent a36f23b572
commit d31bd63edc
No known key found for this signature in database
GPG Key ID: 9C4585B561315571
7 changed files with 65 additions and 58 deletions

View File

@ -55,8 +55,10 @@ FEE = 0.002
# Shall incentivize order making
MAKER_FEE_SPLIT=0.125
# Default bond size as fraction
BOND_SIZE = 0.01
# Bond size as percentage (%)
DEFAULT_BOND_SIZE = 1
MIN_BOND_SIZE = 1
MAX_BOND_SIZE = 15
# Time out penalty for canceling takers in SECONDS
PENALTY_TIMEOUT = 60

View File

@ -14,7 +14,6 @@ import time
FEE = float(config("FEE"))
MAKER_FEE_SPLIT = float(config("MAKER_FEE_SPLIT"))
BOND_SIZE = float(config("BOND_SIZE"))
ESCROW_USERNAME = config("ESCROW_USERNAME")
PENALTY_TIMEOUT = int(config("PENALTY_TIMEOUT"))
@ -698,7 +697,7 @@ class Logics:
# If there was no maker_bond object yet, generates one
order.last_satoshis = cls.satoshis_now(order)
bond_satoshis = int(order.last_satoshis * BOND_SIZE)
bond_satoshis = int(order.last_satoshis * order.bond_size/100)
description = f"RoboSats - Publishing '{str(order)}' - Maker bond - This payment WILL FREEZE IN YOUR WALLET, check on the website if it was successful. It will automatically return unless you cheat or cancel unilaterally."
@ -808,7 +807,7 @@ class Logics:
# If there was no taker_bond object yet, generates one
order.last_satoshis = cls.satoshis_now(order)
bond_satoshis = int(order.last_satoshis * BOND_SIZE)
bond_satoshis = int(order.last_satoshis * order.bond_size/100)
pos_text = "Buying" if cls.is_buyer(order, user) else "Selling"
description = (
f"RoboSats - Taking 'Order {order.id}' {pos_text} BTC for {str(float(order.amount)) + Currency.currency_dict[str(order.currency.currency)]}"

View File

@ -20,7 +20,7 @@ import json
MIN_TRADE = int(config("MIN_TRADE"))
MAX_TRADE = int(config("MAX_TRADE"))
FEE = float(config("FEE"))
BOND_SIZE = float(config("BOND_SIZE"))
DEFAULT_BOND_SIZE = float(config("DEFAULT_BOND_SIZE"))
class Currency(models.Model):
@ -106,8 +106,8 @@ class LNPayment(models.Model):
default=None,
blank=True)
num_satoshis = models.PositiveBigIntegerField(validators=[
MinValueValidator(MIN_TRADE * BOND_SIZE),
MaxValueValidator(MAX_TRADE * (1 + BOND_SIZE + FEE)),
MinValueValidator(100),
MaxValueValidator(MAX_TRADE * (1 + DEFAULT_BOND_SIZE + FEE)),
])
created_at = models.DateTimeField()
expires_at = models.DateTimeField()
@ -229,6 +229,18 @@ class Order(models.Model):
],
blank=False,
)
# optionally makers can choose the fidelity bond size of the maker and taker (%)
bond_size = models.DecimalField(
max_digits=4,
decimal_places=2,
default=DEFAULT_BOND_SIZE,
null=False,
validators=[
MinValueValidator(float(config("MIN_BOND_SIZE"))), # 1 %
MaxValueValidator(float(config("MAX_BOND_SIZE"))), # 15 %
],
blank=False,
)
# how many sats at creation and at last check (relevant for marked to market)
t0_satoshis = models.PositiveBigIntegerField(

View File

@ -36,6 +36,7 @@ class MakeOrderSerializer(serializers.ModelSerializer):
"premium",
"satoshis",
"public_duration",
"bond_size",
)
class UpdateOrderSerializer(serializers.Serializer):

View File

@ -30,6 +30,8 @@ from decouple import config
EXP_MAKER_BOND_INVOICE = int(config("EXP_MAKER_BOND_INVOICE"))
RETRY_TIME = int(config("RETRY_TIME"))
PUBLIC_DURATION = 60*60*int(config("DEFAULT_PUBLIC_ORDER_DURATION"))-1
BOND_SIZE = int(config("DEFAULT_BOND_SIZE"))
avatar_path = Path(settings.AVATAR_ROOT)
avatar_path.mkdir(parents=True, exist_ok=True)
@ -73,6 +75,13 @@ class MakerView(CreateAPIView):
satoshis = serializer.data.get("satoshis")
is_explicit = serializer.data.get("is_explicit")
public_duration = serializer.data.get("public_duration")
bond_size = serializer.data.get("bond_size")
# Optional params
if public_duration == None:
public_duration = PUBLIC_DURATION
if bond_size == None:
bond_size = BOND_SIZE
valid, context, _ = Logics.validate_already_maker_or_taker(
request.user)
@ -89,9 +98,10 @@ class MakerView(CreateAPIView):
satoshis=satoshis,
is_explicit=is_explicit,
expires_at=timezone.now() + timedelta(
seconds=EXP_MAKER_BOND_INVOICE), # TODO Move to class method
seconds=EXP_MAKER_BOND_INVOICE),
maker=request.user,
public_duration=public_duration,
bond_size=bond_size,
)
# TODO move to Order class method when new instance is created!
@ -686,7 +696,7 @@ class InfoView(ListAPIView):
context["network"] = config("NETWORK")
context["maker_fee"] = float(config("FEE"))*float(config("MAKER_FEE_SPLIT"))
context["taker_fee"] = float(config("FEE"))*(1 - float(config("MAKER_FEE_SPLIT")))
context["bond_size"] = float(config("BOND_SIZE"))
context["bond_size"] = float(config("DEFAULT_BOND_SIZE"))
if request.user.is_authenticated:
context["nickname"] = request.user.username

View File

@ -59,7 +59,6 @@ export default class MakerPage extends Component {
showAdvanced: false,
allowBondless: false,
publicExpiryTime: new Date(0, 0, 0, 23, 59),
publicDuration: 23*60*60 + 59*60,
enableAmountRange: false,
minAmount: null,
bondSize: 1,
@ -139,7 +138,6 @@ export default class MakerPage extends Component {
handleCreateOfferButtonPressed=()=>{
this.state.amount == null ? this.setState({amount: 0}) : null;
const requestOptions = {
method: 'POST',
headers: {'Content-Type':'application/json', 'X-CSRFToken': getCookie('csrftoken')},
@ -152,6 +150,7 @@ export default class MakerPage extends Component {
premium: this.state.is_explicit ? null: this.state.premium,
satoshis: this.state.is_explicit ? this.state.satoshis: null,
public_duration: this.state.publicDuration,
bond_size: this.state.bondSize,
}),
};
fetch("/api/make/",requestOptions)
@ -174,19 +173,6 @@ export default class MakerPage extends Component {
return this.state.currencies_dict[val.toString()]
}
handleBlur = () => {
if (this.state.bondSize < 0) {
this.setState({bondSize:0});
} else if (this.state.bondSize > 100) {
this.setState({bondSize:20});
}
};
handleSliderBondSizeChange = (event, newValue) => {
this.setState({bondSize: newValue});
};
handleInputBondSizeChange = (event) => {
this.setState({bondSize: event.target.value === '' ? 1 : Number(event.target.value)});
};
@ -358,9 +344,36 @@ export default class MakerPage extends Component {
AdvancedMakerOptions = () => {
return(
<Paper elevation={12} style={{ padding: 8, width:280, align:'center'}}>
<Grid container xs={12} spacing={1}>
<Grid item xs={12} align="center" spacing={1}>
<FormControl align="center">
<FormHelperText>
<Tooltip enterTouchDelay="0" title={"Set the skin-in-the-game (increase for higher safety assurance)"}>
<div align="center" style={{display:'flex',flexWrap:'wrap', transform: 'translate(20%, 0)'}}>
Fidelity Bond Size <LockIcon sx={{height:20,width:20}}/>
</div>
</Tooltip>
</FormHelperText>
<Slider
sx={{width:220, align:"center"}}
aria-label="Bond Size (%)"
defaultValue={1}
valueLabelDisplay="auto"
valueLabelFormat={(x) => (x+'%')}
step={0.25}
marks={[{value: 1,label: '1%'},{value: 5,label: '5%'},{value: 10,label: '10%'},{value: 15,label: '15%'}]}
min={1}
max={15}
onChange={(e) => this.setState({bondSize: e.target.value})}
/>
</FormControl>
</Grid>
<Grid item xs={12} align="center" spacing={1}>
<br/>
<LocalizationProvider dateAdapter={DateFnsUtils}>
<TimePicker
ampm={false}
@ -377,7 +390,7 @@ export default class MakerPage extends Component {
/>
</LocalizationProvider>
</Grid>
<Grid item xs={12} align="center" spacing={1}>
<FormControl align="center">
<FormHelperText>
@ -403,7 +416,6 @@ export default class MakerPage extends Component {
track="inverted"
value={this.state.minAmount ? this.state.minAmount : this.state.amount}
step={this.state.amount/100}
getAriaValueText={this.bondSizeText}
valueLabelDisplay="auto"
valueLabelFormat={(x) => (x+" "+this.state.currencyCode)}
marks={this.state.amount == null ?
@ -419,35 +431,6 @@ export default class MakerPage extends Component {
</Grid>
</FormControl>
</Grid>
<Grid item xs={12} align="center" spacing={1}>
<FormControl align="center">
<FormHelperText>
<Tooltip enterTouchDelay="0" title={"COMING SOON - Increase for a higher safety assurance"}>
<div align="center" style={{display:'flex',flexWrap:'wrap', transform: 'translate(20%, 0)'}}>
<LockIcon sx={{height:20,width:20}}/> Fidelity Bond Size
</div>
</Tooltip>
</FormHelperText>
<Slider
disabled
sx={{width:220, align:"center"}}
aria-label="Bond Size (%)"
defaultValue={1}
getAriaValueText={this.bondSizeText}
valueLabelDisplay="auto"
valueLabelFormat={(x) => (x+'%')}
step={0.5}
marks={[{value: 1,label: '1%'},{value: 3,label: '3%'},{value: 5,label: '5%'},{value: 9,label: '9%'},{value: 15,label: '15%'}]}
min={1}
max={15}
onChange={this.handleSliderBondSizeChange}
/>
</FormControl>
</Grid>
<Grid item xs={12} align="center" spacing={1}>
<Tooltip enterTouchDelay="0" title={"COMING SOON - High risk! Limited to "+ this.maxBondlessSats/1000 +"K Sats"}>

File diff suppressed because one or more lines are too long