Skip to content

3. Pricing Auction Specification

Yves-Laurent Kom Samo edited this page Sep 6, 2018 · 8 revisions

Pricing Auction Rules

Each bid submitted is considered to be the maximum price the bidder is willing to pay to access the Devise alternative exchange for a month, per seat, and per unit of total incremental usefulness.

All bids should be higher than the starting bid of 1,000 DVZ (per seat and per unit of total incremental usefulness) or will be rejected.

All successful bidders always end up paying the same rent per seat.

The rent charged to a successful bidder for a term is calculated as the product of the auction price, the total incremental usefulness of the Devise alternative exchange at the beginning of the term, and the number of seats attributed to the bidder.

Bids submitted are automatically valid for all subsequent terms until they are canceled. However, clients whose escrow accounts aren't sufficiently funded to honor their bids will see their bids invalidated, and will lose access to the alternative exchange. Bids are canceled by making a call to DeviseClient.cancel_bid.

Auction terms are monthly, and seats are automatically reallocated every month.

Bids are accepted throughout the month for the following term.

Every auction ends on the first day of the month at 00:00:00 UTC, which is also the beginning of the associated rental term.

Our auction algorithm aims at finding the fair value of the Devise alternative exchange to all investment managers, under the scarcity constraint that the number of investment managers authorized to access the Devise alternative exchange is capped.

Specifically, the auction price per seat and per bit of incremental usefulness p* is the price that maximizes the total value of the Devise alternative exchange under the scarcity constraint that only 100 seats can be attributed at a time in any given term:

auction_price_optimization.png

where n(p) is the number of seats that would be allocated if we set the auction price to p, considering all valid bids, and pmin = 1000 is the starting bid.

The auction algorithm is automatically run every time a bid is either submitted, amended or canceled, and seats are temporarily allocated. At 00:00:00 UTC on the first day of each month, the last seat allocation is automatically frozen and considered good for the month starting.

Once the auction price has been set, seats are attributed with a price and time priority. Clients who bid higher, and therefore we should think can get more out of the Devise alternative exchange, always get their seats first, and are able to make Devise seats as scarce as they want. Seats are attributed to clients who bid the same limit price on a first come first serve basis; the time used is the time the bid was last modified.

All bids are public and can be retrieved by running

from devise import DeviseClient
# Create a Devise client object to interact with our smart contracts and API.
devise_client = DeviseClient(account='0xd4a6B94E45B8c0185...')

# Retrieve all bids ever submitted. For each address, only the last bid submitted is returned.
all_bids = devise_client.get_all_bidders(active=False)

# Retrieve all valid bids included in the auction calculation for the following term.
valid_bids = devise_client.get_all_bidders(active=True)

Outputs are lists of dictionaries of the form

{'address': '0xA1C2684B68A98c9636FC22F3B4E4332eF35A2408', 'limit_price': 1567, 'requested_seats': 1}

and correspond to the latest bids submitted by the associated addresses.

The auction price for the current term and the indicative auction price for the next term can be retrieved by running

from devise import DeviseClient
# Create a DeviseClient object to interact with our smart contracts and API.
devise_client = DeviseClient(account='0xd4a6B94E45B8c0185...')

# Retrieve current term rent per seat and per unit of total incremental usefulness.
current_term_price = devise_client.price_per_bit_current_term

# Retrieve next term indicative rent per seat and per unit of total incremental usefulness.
next_term_indicative_price = devise_client.indicative_price_per_bit_next_term

The monthly rent per seat for the current term and the indicative rent per seat for the following term can be retrieved by running

from devise import DeviseClient
# Create a DeviseClient object to interact with our smart contracts and API.
devise_client = DeviseClient(account='0xd4a6B94E45B8c0185...')

# Retrieve current term rent per seat and per unit of total incremental usefulness.
current_term_rent = devise_client.rent_per_seat_current_term

# Retrieve next term indicative rent per seat and per unit of total incremental usefulness.
next_term_indicative_rent = devise_client.indicative_rent_per_seat_next_term

To retrieve the list of all leptons currently on the Devise alternative exchange and the incremental usefulness each added to the chain when it was found, run

from devise import DeviseClient
# Create a DeviseClient object to interact with our smart contracts and API.
devise_client = DeviseClient(account='0xd4a6B94E45B8c0185...')

# Retrieve the list of all leptons currently on the Devise alternative exchange.
# Leptons are always returned in the order in which they were found.
all_leptons = devise_client.get_all_leptons()
all_lepton_hashes = [lepton['hash'] for lepton in all_leptons]
all_lepton_usefulnesses = [lepton['incremental_usefulness'] for lepton in all_leptons]

# Retrieve the total usefulness.
total_usefulness = devise_client.total_incremental_usefulness
assert sum(all_lepton_incremental_usefulness) == total_usefulness