more reorganizing
This commit is contained in:
parent
a2a1035da8
commit
77ae33ce5a
|
@ -1,43 +0,0 @@
|
|||
# Primary
|
||||
|
||||
## Forum
|
||||
|
||||
## ValidationPool
|
||||
|
||||
## ReputationToken
|
||||
|
||||
## WDAG
|
||||
|
||||
# Secondary
|
||||
|
||||
## Availability
|
||||
|
||||
## Business
|
||||
|
||||
## ERC721
|
||||
|
||||
## Expert
|
||||
|
||||
## Bench
|
||||
|
||||
# Tertiary
|
||||
|
||||
## Actor
|
||||
|
||||
## Action
|
||||
|
||||
## Scene
|
||||
|
||||
# To Explore
|
||||
|
||||
## Exchange
|
||||
|
||||
## Storage
|
||||
|
||||
## Network
|
||||
|
||||
## Wallet
|
||||
|
||||
## Agent/UI
|
||||
|
||||
## BlockConsensus
|
|
@ -0,0 +1 @@
|
|||
Each DAO needs to allocate some of its incoming fees to incentivize development.
|
|
@ -1,7 +1,7 @@
|
|||
import { Action } from '../display/action.js';
|
||||
import { PostMessage } from '../forum-network/message.js';
|
||||
import { CryptoUtil } from '../util/crypto.js';
|
||||
import { ReputationHolder } from './reputation-holder.js';
|
||||
import { ReputationHolder } from '../reputation/reputation-holder.js';
|
||||
|
||||
export class Expert extends ReputationHolder {
|
||||
constructor(dao, name, scene) {
|
||||
|
@ -47,7 +47,7 @@ export class Expert extends ReputationHolder {
|
|||
}
|
||||
|
||||
async initiateValidationPool(poolOptions) {
|
||||
// For now, directly call bench.initiateValidationPool();
|
||||
// For now, make direct call rather than network
|
||||
poolOptions.reputationPublicKey = this.reputationPublicKey;
|
||||
const pool = await this.dao.initiateValidationPool(poolOptions);
|
||||
this.tokens.push(pool.tokenId);
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
import { Actor } from '../display/actor.js';
|
||||
import { displayNumber } from '../../util.js';
|
||||
import params from '../../params.js';
|
||||
|
||||
export class Post extends Actor {
|
||||
constructor(forum, authorPublicKey, postContent) {
|
||||
const index = forum.posts.countVertices();
|
||||
const name = `Post${index + 1}`;
|
||||
super(name, forum.scene);
|
||||
this.id = postContent.id ?? name;
|
||||
this.authorPublicKey = authorPublicKey;
|
||||
this.value = 0;
|
||||
this.initialValue = 0;
|
||||
this.citations = postContent.citations;
|
||||
this.title = postContent.title;
|
||||
const leachingTotal = this.citations
|
||||
.filter(({ weight }) => weight < 0)
|
||||
.reduce((total, { weight }) => total += -weight, 0);
|
||||
const donationTotal = this.citations
|
||||
.filter(({ weight }) => weight > 0)
|
||||
.reduce((total, { weight }) => total += weight, 0);
|
||||
if (leachingTotal > params.revaluationLimit) {
|
||||
throw new Error('Post leaching total exceeds revaluation limit '
|
||||
+ `(${leachingTotal} > ${params.revaluationLimit})`);
|
||||
}
|
||||
if (donationTotal > params.revaluationLimit) {
|
||||
throw new Error('Post donation total exceeds revaluation limit '
|
||||
+ `(${donationTotal} > ${params.revaluationLimit})`);
|
||||
}
|
||||
if (this.citations.some(({ weight }) => Math.abs(weight) > params.revaluationLimit)) {
|
||||
throw new Error(`Each citation magnitude must not exceed revaluation limit ${params.revaluationLimit}`);
|
||||
}
|
||||
}
|
||||
|
||||
getLabel() {
|
||||
return `${this.name}
|
||||
<table><tr>
|
||||
<td>initial</td>
|
||||
<td>${displayNumber(this.initialValue)}</td>
|
||||
</tr><tr>
|
||||
<td>value</td>
|
||||
<td>${displayNumber(this.value)}</td>
|
||||
</tr></table>`
|
||||
.replaceAll(/\n\s*/g, '');
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
import params from '../../params.js';
|
||||
import { Forum } from './forum.js';
|
||||
import { ReputationTokenContract } from '../contracts/reputation-token.js';
|
||||
import { ReputationTokenContract } from '../reputation/reputation-token.js';
|
||||
import { ValidationPool } from './validation-pool.js';
|
||||
import { Availability } from './availability.js';
|
||||
import { Business } from './business.js';
|
||||
|
@ -72,9 +72,4 @@ export class DAO extends Actor {
|
|||
|
||||
return pool;
|
||||
}
|
||||
|
||||
async submitPost(reputationPublicKey, postContent) {
|
||||
const post = await this.forum.addPost(reputationPublicKey, postContent);
|
||||
return post.id;
|
||||
}
|
||||
}
|
|
@ -1,13 +1,56 @@
|
|||
import { WDAG } from '../supporting/wdag.js';
|
||||
import { Action } from '../display/action.js';
|
||||
import { Actor } from '../display/actor.js';
|
||||
import params from '../../params.js';
|
||||
import { ReputationHolder } from './reputation-holder.js';
|
||||
import { ReputationHolder } from '../reputation/reputation-holder.js';
|
||||
import { displayNumber, EPSILON } from '../../util.js';
|
||||
import { Post } from './post.js';
|
||||
|
||||
const CITATION = 'citation';
|
||||
const BALANCE = 'balance';
|
||||
|
||||
class Post extends Actor {
|
||||
constructor(forum, authorPublicKey, postContent) {
|
||||
const index = forum.posts.countVertices();
|
||||
const name = `Post${index + 1}`;
|
||||
super(name, forum.scene);
|
||||
this.id = postContent.id ?? name;
|
||||
this.authorPublicKey = authorPublicKey;
|
||||
this.value = 0;
|
||||
this.initialValue = 0;
|
||||
this.citations = postContent.citations;
|
||||
this.title = postContent.title;
|
||||
const leachingTotal = this.citations
|
||||
.filter(({ weight }) => weight < 0)
|
||||
.reduce((total, { weight }) => total += -weight, 0);
|
||||
const donationTotal = this.citations
|
||||
.filter(({ weight }) => weight > 0)
|
||||
.reduce((total, { weight }) => total += weight, 0);
|
||||
if (leachingTotal > params.revaluationLimit) {
|
||||
throw new Error('Post leaching total exceeds revaluation limit '
|
||||
+ `(${leachingTotal} > ${params.revaluationLimit})`);
|
||||
}
|
||||
if (donationTotal > params.revaluationLimit) {
|
||||
throw new Error('Post donation total exceeds revaluation limit '
|
||||
+ `(${donationTotal} > ${params.revaluationLimit})`);
|
||||
}
|
||||
if (this.citations.some(({ weight }) => Math.abs(weight) > params.revaluationLimit)) {
|
||||
throw new Error(`Each citation magnitude must not exceed revaluation limit ${params.revaluationLimit}`);
|
||||
}
|
||||
}
|
||||
|
||||
getLabel() {
|
||||
return `${this.name}
|
||||
<table><tr>
|
||||
<td>initial</td>
|
||||
<td>${displayNumber(this.initialValue)}</td>
|
||||
</tr><tr>
|
||||
<td>value</td>
|
||||
<td>${displayNumber(this.value)}</td>
|
||||
</tr></table>`
|
||||
.replaceAll(/\n\s*/g, '');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Purpose:
|
||||
* - Forum: Maintain a directed, acyclic, graph of positively and negatively weighted citations.
|
|
@ -1,4 +1,4 @@
|
|||
import { ReputationHolder } from './reputation-holder.js';
|
||||
import { ReputationHolder } from '../reputation/reputation-holder.js';
|
||||
import { Stake } from '../supporting/stake.js';
|
||||
import { Voter } from '../supporting/voter.js';
|
||||
import params from '../../params.js';
|
|
@ -42,4 +42,8 @@ export class Table {
|
|||
cell.innerHTML = typeof value === 'number' ? displayNumber(value) : value ?? '';
|
||||
}
|
||||
}
|
||||
|
||||
listUniqueValueKeys() {
|
||||
return this.columns; // TODO
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import {
|
|||
} from './message.js';
|
||||
import { ForumView } from './forum-view.js';
|
||||
import { NetworkNode } from './network-node.js';
|
||||
import { randomID } from '../../util.js';
|
||||
import { randomID } from '../util/util.js';
|
||||
|
||||
export class ForumNode extends NetworkNode {
|
||||
constructor(name, scene) {
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
import { DAO } from '../actors/dao.js';
|
||||
/**
|
||||
* An Exchange provides conversion between currencies / facilitates such.
|
||||
* That means they carry some of the risk of managing these transactions.
|
||||
*
|
||||
*/
|
||||
|
||||
class Offer {
|
||||
constructor({
|
||||
_fromType, _toType, _amount, price,
|
||||
}) {
|
||||
this.price = price;
|
||||
// const from =
|
||||
}
|
||||
}
|
||||
|
||||
export class Exchange extends DAO {
|
||||
constructor(name, scene) {
|
||||
super(name, scene);
|
||||
this.offersByType = new Map(); // <OfferType, Map<OfferId, Offer>>
|
||||
}
|
||||
|
||||
getOffers(offerType) {
|
||||
return this.buyOffersByType.get(offerType) ?? new Map(); // <
|
||||
}
|
||||
|
||||
addOffer(offerOptions) {
|
||||
const offer = new Offer(offerOptions);
|
||||
const { fromType, toType } = offer;
|
||||
[fromType, toType].forEach((type) => {
|
||||
this.offersByType.s();
|
||||
});
|
||||
}
|
||||
|
||||
requestTransaction({
|
||||
fromType, toType, amount, price,
|
||||
}) {
|
||||
// this.
|
||||
}
|
||||
|
||||
buy(fromType, toType, _priceParameters) {
|
||||
const buyOffer = {
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,10 +1,6 @@
|
|||
export class Token {
|
||||
constructor(ownerPublicKey) {
|
||||
this.ownerPublicKey = ownerPublicKey;
|
||||
}
|
||||
/**
|
||||
* Finance does the work of analysis of the dynamics of reputation and currency exchange
|
||||
*/
|
||||
|
||||
transfer(newOwnerPublicKey) {
|
||||
// TODO: Current owner must sign this request
|
||||
this.ownerPublicKey = newOwnerPublicKey;
|
||||
}
|
||||
export class Finance {
|
||||
}
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
import { randomID } from '../util/util.js';
|
||||
|
||||
class Pledge {
|
||||
constructor({ stake, duration }) {
|
||||
this.stake = stake;
|
||||
this.duration = duration;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Storage work is providing data availability and integrity.
|
||||
* It probably makes sense to manage it in pledges of finite duration.
|
||||
*/
|
||||
export class Storage {
|
||||
constructor() {
|
||||
this.pledges = new Map();
|
||||
}
|
||||
|
||||
pledge(pledgeOptions) {
|
||||
const id = randomID();
|
||||
this.pledge.set(id, new Pledge(pledgeOptions));
|
||||
return id;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
import { ERC721 } from './erc721.js';
|
||||
import { ERC721 } from '../supporting/erc721.js';
|
||||
|
||||
import { EPSILON, randomID } from '../../util.js';
|
||||
|
|
@ -15,8 +15,12 @@
|
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/radash/10.7.0/radash.js"
|
||||
integrity="sha512-S207zKWG3iqXqe6msO7/Mr8X3DzzF4u8meFlokHjGtBPTGUhgzVo0lpcqEy0GoiMUdcoct+H+SqzoLsxXbynzg=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="https://unpkg.com/mocha/mocha.js"></script>
|
||||
<script src="https://unpkg.com/chai/chai.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/10.2.0/mocha.min.js"
|
||||
integrity="sha512-jsP/sG70bnt0xNVJt+k9NxQqGYvRrLzWhI+46SSf7oNJeCwdzZlBvoyrAN0zhtVyolGcHNh/9fEgZppG2pH+eA=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/4.3.7/chai.min.js"
|
||||
integrity="sha512-tfLUmTr4u39/6Pykb8v/LjLaQ9u/uSgbHtZXFCtT9bOsZd1ZPZabIrwhif/YzashftTOhwwQUC0cQyrnIC1vEQ=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script type="module" src="./scripts/business.test.js"></script>
|
||||
<script defer class="mocha-init">
|
||||
mocha.setup({
|
||||
|
|
|
@ -16,8 +16,12 @@
|
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/radash/10.7.0/radash.js"
|
||||
integrity="sha512-S207zKWG3iqXqe6msO7/Mr8X3DzzF4u8meFlokHjGtBPTGUhgzVo0lpcqEy0GoiMUdcoct+H+SqzoLsxXbynzg=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="https://unpkg.com/mocha/mocha.js"></script>
|
||||
<script src="https://unpkg.com/chai/chai.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/10.2.0/mocha.min.js"
|
||||
integrity="sha512-jsP/sG70bnt0xNVJt+k9NxQqGYvRrLzWhI+46SSf7oNJeCwdzZlBvoyrAN0zhtVyolGcHNh/9fEgZppG2pH+eA=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/4.3.7/chai.min.js"
|
||||
integrity="sha512-tfLUmTr4u39/6Pykb8v/LjLaQ9u/uSgbHtZXFCtT9bOsZd1ZPZabIrwhif/YzashftTOhwwQUC0cQyrnIC1vEQ=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script type="module" src="./scripts/forum-network.test.js"></script>
|
||||
<script defer class="mocha-init">
|
||||
mocha.setup({
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
<div id="scene"></div>
|
||||
</body>
|
||||
<script type="module">
|
||||
import { Box } from '../classes/box.js';
|
||||
import { Scene } from '../classes/scene.js';
|
||||
import { Box } from '../classes/display/box.js';
|
||||
import { Scene } from '../classes/display/scene.js';
|
||||
// import { ValidationPool } from '../classes/validation-pool.js';
|
||||
// import { TokenHolder } from '../classes/token-holder.js';
|
||||
// import { ReputationToken } from '../classes/reputation-token.js';
|
||||
|
|
|
@ -2,7 +2,7 @@ import { Box } from '../../classes/display/box.js';
|
|||
import { Scene } from '../../classes/display/scene.js';
|
||||
import { Expert } from '../../classes/actors/expert.js';
|
||||
import { delay } from '../../util.js';
|
||||
import { DAO } from '../../classes/actors/dao.js';
|
||||
import { DAO } from '../../classes/dao/dao.js';
|
||||
import { Public } from '../../classes/actors/public.js';
|
||||
import { PostContent } from '../../classes/util/post-content.js';
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import { Expert } from '../../../classes/actors/expert.js';
|
|||
import { PostContent } from '../../../classes/util/post-content.js';
|
||||
import { delay } from '../../../util.js';
|
||||
import params from '../../../params.js';
|
||||
import { DAO } from '../../../classes/actors/dao.js';
|
||||
import { DAO } from '../../../classes/dao/dao.js';
|
||||
|
||||
export class ForumTest {
|
||||
constructor(options) {
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Scene } from '../../classes/display/scene.js';
|
|||
import { Expert } from '../../classes/actors/expert.js';
|
||||
import { PostContent } from '../../classes/util/post-content.js';
|
||||
import { delay } from '../../util.js';
|
||||
import { DAO } from '../../classes/actors/dao.js';
|
||||
import { DAO } from '../../classes/dao/dao.js';
|
||||
|
||||
const POOL_DURATION_MS = 100;
|
||||
const DEFAULT_DELAY_MS = 100;
|
||||
|
|
Loading…
Reference in New Issue