From 0d9b2d7d5896d9a9d857ec5d3a6a9a87b6b4af4e Mon Sep 17 00:00:00 2001 From: Michael Bumann Date: Sun, 24 Mar 2019 11:01:59 +0100 Subject: [PATCH] readme --- README.md | 128 +++++++++------------------- apps/contribution/README.md | 163 +----------------------------------- apps/contributor/README.md | 163 +----------------------------------- apps/proposal/README.md | 163 +----------------------------------- apps/token/README.md | 163 +----------------------------------- docs/kredits-diagram.png | Bin 0 -> 15137 bytes 6 files changed, 43 insertions(+), 737 deletions(-) create mode 100644 docs/kredits-diagram.png diff --git a/README.md b/README.md index 80c5f3d..ff229bc 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,12 @@ # Kredits Contracts -This repository contains the Solidity smart contracts and JavaScript API -wrapper for [Kosmos Kredits](https://wiki.kosmos.org/Kredits). +This repository contains the Solidity smart contracts organized as [Aragon](https://hack.aragon.org/) +apps and JavaScript API wrapper for [Kosmos Kredits](https://wiki.kosmos.org/Kredits). -It uses the [Truffle framework](http://truffleframework.com/) for some things. +It is based on [aragonOS](https://hack.aragon.org/docs/aragonos-intro.html) and +follows the aragonOS conventions. +Aragon itself uses the [Truffle framework](http://truffleframework.com/) for some things. ## Development @@ -17,77 +19,40 @@ It uses the [Truffle framework](http://truffleframework.com/) for some things. All requirements are defined in `package.json`. -Those can be installed globally for convenience: +### Local development chain - * [truffle framework](http://truffleframework.com): `npm install -g truffle` - * [ganache](http://truffleframework.com/ganache): `npm install -g ganache-cli` +For local development it is recommended to use +[ganache](http://truffleframework.com/ganache/) to run a local development +chain. Using the ganache simulator no full Ethereum node is required. -We use following solidity contract libraries: +We use the default aragon-cli devchain command to confgure and run a local +development ganache. - * [Open Zeppelin](https://github.com/OpenZeppelin/zeppelin-solidity) +`npm run devchain` (or `aragon devchain --port 7545) -For local development it is recommended to use -[ganache-cli](https://github.com/trufflesuite/ganache-cli) (or the [ganache -GUI](http://truffleframework.com/ganache/) to run a local development chain. -Using the ganache simulator no full Ethereum node is required. +To clear/reset the chain use: -We default to: +`npm run devchain -- --reset` (or `aragon devchain --port 7545 --reset`) -* port 7545 for development to not get in conflict with the default Ethereum - RPC port. -* network ID 100 to stay on the same network id -* store ganache data in .ganache-db to presist the chain data across restarts -* use a fixed Mnemonic code to get the same accounts across restarts +We default to port 7545 for development to not get in conflict with the default +Ethereum RPC port. -Have a look at `ganache-cli` for more configuration options. - -Run your ganache simulator before using Kredits locally: - - $ npm run ganache (which is: ganache-cli -p 7545 -i 100 --db=./.ganache-db -m kredits) - -### Truffle console - -Truffle comes with a simple REPL to interact with the Smart Contracts. Have a -look at the [documentation -here](http://truffleframework.com/docs/getting_started/console) - -NOTE: There are promisses, have a look at the examples: - -```javascript -Token.deployed().then(function(token) { - token.totalSupply.call().then(function(value) { - console.log(value.toString()); - }) -}); -``` - -Also please be aware of the differences between web3.js 0.2x.x and -[1.x.x](https://web3js.readthedocs.io/en/1.0/) - [web3 -repo](https://github.com/ethereum/web3.js/) ## Contract Deployment -Truffle uses migration scripts to deploy contract to various networks. Have a -look at the `migrations` folder for those. The Ethereum nodes for the -different networks need to be configured in `truffle.js`. +Contracts are organized in independent apps (see `/apps`) and are developed +and deployed independently. Each app has a version and can be "installed" +on the Kredits DAO independently. -Run the truffle migration scripts: +![](docs/kredits-diagram.png) - $ truffle deploy - $ truffle deploy --network= +A DAO can be deployed using the `scripts/deploy-kit.js` script or with the +`npm run deploy:dao:dev` command. This deploys a new Kredits DAO, installs +the latest app versions and sets the required permissions. -Truffle keeps track of already executed migration scripts. To reset the -migration use the `--reset` option +See each app in `/apps/*` for details. - $ truffle migrate --reset - -Migration scripts can also be run from within `truffle console` or `truffle -develop` - -To initially bootstrap a local development chain in ganache you can use the -bootstrap script: - - $ npm run bootstrap +## ACL / Permissions ## Helper scripts @@ -123,6 +88,12 @@ Adds a new proposal for an existing contributor $ truffle exec scripts/add-proposal.js +### add-contribution.js + +Adds a new contribution for an existing contributor + + $ truffle exec scripts/add-contribution.js + ### send-funds.js Sends funds to an address. Helpful in development mode to for example fund a @@ -139,40 +110,19 @@ Run seeds defined in `config/seeds.js`. ## Upgradeable contracts -Some of the contracts use upgradability ideas from -[zeppelinos](https://github.com/zeppelinos/labs) (see `contracts/upgradable`). - -The basic idea is to have a Registry contract that knows about the current -implementations and a Proxy contract that uses `delegatecall` to call the -current implementation. That means the Proxy contract holds the storage and -the address of that one does not change but the actuall implemenation is -managed through the Registry. - -To deploy a new version a new contract is deployed then the version is -registered (`addVersion()`) in the Registry and on the Proxy contract is -"upgraded" (`upgrade()`) to the new version. - -The Registry knows about all the different contracts and implementations. -Versions are stored as uint and automatically incremented for every added -implementation. +We use aragonOS for upgradeablity of the different contracts. +Refer to the [aragonOS upgradeablity documentation](https://hack.aragon.org/docs/upgradeability-intro) +for more details. ### Example -Deployment is best done using the truffle deployer. - 1. Setup - 1. Deploy the Registry - 2. Deploy the contract - 3. Register the contract at the Registry: - `registry.addVersion('Token', Token.address)` - 4. Create the Proxy: - `registry.createProxy('Token', 1)` + 1. Deploy each contract/apps (see `/apps/*`) + 2. Create a new DAO (see scripts/deploy-kit.js) 2. Update - 1. Deploy a new Version of the contract - 2. Register the new version at the Registry: - `registry.addVersion('Token', NewToken.address)` - 3. Set the new implementation address on the Proxy contract: - `registry.upgrade('Token', 2)` + 1. Deploy a new Version of the contract/app (see `/apps/*`) + 2. Use the `aragon dao upgrade` command to "install" the new version for the DAO + (`aragon dao upgrade `) ## Known Issues diff --git a/apps/contribution/README.md b/apps/contribution/README.md index fc42cf0..4ed52a5 100644 --- a/apps/contribution/README.md +++ b/apps/contribution/README.md @@ -1,162 +1 @@ -# Aragon React Boilerplate - -> 🕵️ [Find more boilerplates using GitHub](https://github.com/search?q=topic:aragon-boilerplate) | -> ✨ [Official boilerplates](https://github.com/search?q=topic:aragon-boilerplate+org:aragon) - -React boilerplate for Aragon applications. - -This boilerplate also includes a fully working example app, complete with a background worker and a front-end in React (with Aragon UI). - -## Usage - -```sh -aragon init app.aragonpm.eth react -``` - -## Running your app - -### Using HTTP - -Running your app using HTTP will allow for a faster development process of your app's front-end, as it can be hot-reloaded without the need to execute `aragon run` every time a change is made. - -- First start your app's development server running `npm run start:app`, and keep that process running. By default it will rebuild the app and reload the server when changes to the source are made. - -- After that, you can run `npm run start:aragon:http` which will compile your app's contracts, publish the app locally and create a DAO. You will need to stop it and run it again after making changes to your smart contracts. - -Changes to the app's background script (`app/script.js`) cannot be hot-reloaded, after making changes to the script, you will need to either restart the development server (`npm run start:app`) or rebuild the script `npm run build:script`. - -### Using IPFS - -Running your app using IPFS will mimic the production environment that will be used for running your app. `npm run start:aragon:ipfs` will run your app using IPFS. Whenever a change is made to any file in your front-end, a new version of the app needs to be published, so the command needs to be restarted. - -## What's in the box? - -### npm Scripts - -- **start** or **start:aragon:ipfs**: Runs your app inside a DAO served from IPFS -- **start:aragon:http**: Runs your app inside a DAO served with HTTP (hot reloading) -- **start:app**: Starts a development server for your app -- **compile**: Compile the smart contracts -- **build**: Builds the front-end and background script -- **build:app**: Builds the front-end -- **build:script**: Builds the background script -- **test**: Runs tests for the contracts -- **publish:patch**: Release a patch version to aragonPM (only frontend/content changes allowed) -- **publish:minor**: Release a minor version to aragonPM (only frontend/content changes allowed) -- **publish:major**: Release a major version to aragonPM (frontend **and** contract changes) -- **versions**: Check the currently installed versions of the app - -### Libraries - -- [**@aragon/os**](https://github.com/aragon/aragonos): Aragon interfaces -- [**@aragon/client**](https://github.com/aragon/aragon.js/tree/master/packages/aragon-client): Wrapper for Aragon application RPC -- [**@aragon/ui**](https://github.com/aragon/aragon-ui): Aragon UI components (in React) - -## Publish - -This app has 3 environments defined in `arapp.json`: - -| Environment | Network | -|--- |--- | -| default | localhost | -| staging | rinkeby | -| production | mainnet | - -Prerequisites: -- ENS Registry address - -Note: the `default` environment which points to `localhost` does not have an ENS Registry address specified because the `@aragon/cli` will default the value to `0xB9462EF3441346dBc6E49236Edbb0dF207db09B7` (the ENS Registry pre-deployed on the local development chain). - -### Introduction to environments - -Environments are defined in `arapp.json`, for example `staging` points to: -- an ENS registry (`0x314159265dd8dbb310642f98f50c066173c1259b`) -- an APM registry (`open.aragonpm.eth`) -- an APM repository (`app`) -- an Ethereum network (`rinkeby`) -- an Ethereum websockets provider (`wss://rinkeby.eth.aragon.network/ws` - to **read** from the blockchain) - -The `rinkeby` network is further defined in `truffle.js`, and has: -- an Ethereum provider (to **write** to the blockchain): - - an address (`https://rinkeby.infura.io`) - - an Ethereum Account (`0xb4124cEB3451635DAcedd11767f004d8a28c6eE7`) - (which is the first account generated from the `DEFAULT_MNEMONIC` variable, to use a different account see [here](#Using-a-different-Ethereum-account)) - -### Major version: content + contract - -Command: -``` -npm run publish:major -- --environment staging -``` - -This will: -1. _build_ the app's frontend (the output lives in `dist`) -2. _compile_ the app's contract (the output lives in `build`) -3. publish the app to the **staging** environment. - -Sample output: -``` - > aragon apm publish major "--environment" "staging" - - ✔ Successfully published app.open.aragonpm.eth v1.0.0: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ℹ Transaction hash: 0x3d752db29cc106e9ff98b260a90615921eb32471425a29ead8cbb830fb224d8 -``` - -Note: the contract location is defined in `arapp.json` under `path`. -Note: you can also deploy a major version with only frontend changes by passing `--only-content`. - -### Minor/patch version: content only - -Command: -``` -npm run publish:patch -- --environment staging -``` - -This will: -1. _build_ the app's frontend (which lives in `dist`) -2. publish the app to the **staging** environment. - -Sample output: -``` - ✔ Successfully published app.open.aragonpm.eth v1.1.1: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ℹ Transaction hash: 0x57864d8efd8d439008621b494b19a3e8f876a8a46b38475f9626802f0a1403c2 -``` - -### Check published versions - -Command: -``` -npm run versions -- --environment staging -``` - -Sample output: -``` - ℹ app.open.aragonpm.eth has 4 published versions - ✔ 1.0.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ✔ 1.1.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmSwjUZFpv2c2e9fLoxtgFrAsAmBN4DyQGJp4RcqQcW3z3 - ✔ 1.1.1: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ✔ 2.0.0: 0x74CBbbC932d7C344FCd789Eba24BfD40e52980c9 ipfs:Qmadb3hzwLDKtb93fF367Vg1epkdsLZF4dhpapNYynjgZF -``` - -### Using a different Ethereum account - -To deploy from a different account, you can: -- define a `~/.aragon/mnemonic.json` file - ``` - { - "mnemonic": "explain tackle mirror kit ..." - } - ``` - or -- define a `~/.aragon/${network_name}_key.json` file, for example: `~/.aragon/rinkeby_key.json` - ``` - { - "keys": [ - "a8a54b2d8197bc0b19bb8a084031be71835580a01e70a45a13babd16c9bc1563" - ] - } - ``` +# Kredits Contribution diff --git a/apps/contributor/README.md b/apps/contributor/README.md index fc42cf0..b4665c5 100644 --- a/apps/contributor/README.md +++ b/apps/contributor/README.md @@ -1,162 +1 @@ -# Aragon React Boilerplate - -> 🕵️ [Find more boilerplates using GitHub](https://github.com/search?q=topic:aragon-boilerplate) | -> ✨ [Official boilerplates](https://github.com/search?q=topic:aragon-boilerplate+org:aragon) - -React boilerplate for Aragon applications. - -This boilerplate also includes a fully working example app, complete with a background worker and a front-end in React (with Aragon UI). - -## Usage - -```sh -aragon init app.aragonpm.eth react -``` - -## Running your app - -### Using HTTP - -Running your app using HTTP will allow for a faster development process of your app's front-end, as it can be hot-reloaded without the need to execute `aragon run` every time a change is made. - -- First start your app's development server running `npm run start:app`, and keep that process running. By default it will rebuild the app and reload the server when changes to the source are made. - -- After that, you can run `npm run start:aragon:http` which will compile your app's contracts, publish the app locally and create a DAO. You will need to stop it and run it again after making changes to your smart contracts. - -Changes to the app's background script (`app/script.js`) cannot be hot-reloaded, after making changes to the script, you will need to either restart the development server (`npm run start:app`) or rebuild the script `npm run build:script`. - -### Using IPFS - -Running your app using IPFS will mimic the production environment that will be used for running your app. `npm run start:aragon:ipfs` will run your app using IPFS. Whenever a change is made to any file in your front-end, a new version of the app needs to be published, so the command needs to be restarted. - -## What's in the box? - -### npm Scripts - -- **start** or **start:aragon:ipfs**: Runs your app inside a DAO served from IPFS -- **start:aragon:http**: Runs your app inside a DAO served with HTTP (hot reloading) -- **start:app**: Starts a development server for your app -- **compile**: Compile the smart contracts -- **build**: Builds the front-end and background script -- **build:app**: Builds the front-end -- **build:script**: Builds the background script -- **test**: Runs tests for the contracts -- **publish:patch**: Release a patch version to aragonPM (only frontend/content changes allowed) -- **publish:minor**: Release a minor version to aragonPM (only frontend/content changes allowed) -- **publish:major**: Release a major version to aragonPM (frontend **and** contract changes) -- **versions**: Check the currently installed versions of the app - -### Libraries - -- [**@aragon/os**](https://github.com/aragon/aragonos): Aragon interfaces -- [**@aragon/client**](https://github.com/aragon/aragon.js/tree/master/packages/aragon-client): Wrapper for Aragon application RPC -- [**@aragon/ui**](https://github.com/aragon/aragon-ui): Aragon UI components (in React) - -## Publish - -This app has 3 environments defined in `arapp.json`: - -| Environment | Network | -|--- |--- | -| default | localhost | -| staging | rinkeby | -| production | mainnet | - -Prerequisites: -- ENS Registry address - -Note: the `default` environment which points to `localhost` does not have an ENS Registry address specified because the `@aragon/cli` will default the value to `0xB9462EF3441346dBc6E49236Edbb0dF207db09B7` (the ENS Registry pre-deployed on the local development chain). - -### Introduction to environments - -Environments are defined in `arapp.json`, for example `staging` points to: -- an ENS registry (`0x314159265dd8dbb310642f98f50c066173c1259b`) -- an APM registry (`open.aragonpm.eth`) -- an APM repository (`app`) -- an Ethereum network (`rinkeby`) -- an Ethereum websockets provider (`wss://rinkeby.eth.aragon.network/ws` - to **read** from the blockchain) - -The `rinkeby` network is further defined in `truffle.js`, and has: -- an Ethereum provider (to **write** to the blockchain): - - an address (`https://rinkeby.infura.io`) - - an Ethereum Account (`0xb4124cEB3451635DAcedd11767f004d8a28c6eE7`) - (which is the first account generated from the `DEFAULT_MNEMONIC` variable, to use a different account see [here](#Using-a-different-Ethereum-account)) - -### Major version: content + contract - -Command: -``` -npm run publish:major -- --environment staging -``` - -This will: -1. _build_ the app's frontend (the output lives in `dist`) -2. _compile_ the app's contract (the output lives in `build`) -3. publish the app to the **staging** environment. - -Sample output: -``` - > aragon apm publish major "--environment" "staging" - - ✔ Successfully published app.open.aragonpm.eth v1.0.0: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ℹ Transaction hash: 0x3d752db29cc106e9ff98b260a90615921eb32471425a29ead8cbb830fb224d8 -``` - -Note: the contract location is defined in `arapp.json` under `path`. -Note: you can also deploy a major version with only frontend changes by passing `--only-content`. - -### Minor/patch version: content only - -Command: -``` -npm run publish:patch -- --environment staging -``` - -This will: -1. _build_ the app's frontend (which lives in `dist`) -2. publish the app to the **staging** environment. - -Sample output: -``` - ✔ Successfully published app.open.aragonpm.eth v1.1.1: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ℹ Transaction hash: 0x57864d8efd8d439008621b494b19a3e8f876a8a46b38475f9626802f0a1403c2 -``` - -### Check published versions - -Command: -``` -npm run versions -- --environment staging -``` - -Sample output: -``` - ℹ app.open.aragonpm.eth has 4 published versions - ✔ 1.0.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ✔ 1.1.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmSwjUZFpv2c2e9fLoxtgFrAsAmBN4DyQGJp4RcqQcW3z3 - ✔ 1.1.1: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ✔ 2.0.0: 0x74CBbbC932d7C344FCd789Eba24BfD40e52980c9 ipfs:Qmadb3hzwLDKtb93fF367Vg1epkdsLZF4dhpapNYynjgZF -``` - -### Using a different Ethereum account - -To deploy from a different account, you can: -- define a `~/.aragon/mnemonic.json` file - ``` - { - "mnemonic": "explain tackle mirror kit ..." - } - ``` - or -- define a `~/.aragon/${network_name}_key.json` file, for example: `~/.aragon/rinkeby_key.json` - ``` - { - "keys": [ - "a8a54b2d8197bc0b19bb8a084031be71835580a01e70a45a13babd16c9bc1563" - ] - } - ``` +# Kredits Contributor diff --git a/apps/proposal/README.md b/apps/proposal/README.md index fc42cf0..73fe67e 100644 --- a/apps/proposal/README.md +++ b/apps/proposal/README.md @@ -1,162 +1 @@ -# Aragon React Boilerplate - -> 🕵️ [Find more boilerplates using GitHub](https://github.com/search?q=topic:aragon-boilerplate) | -> ✨ [Official boilerplates](https://github.com/search?q=topic:aragon-boilerplate+org:aragon) - -React boilerplate for Aragon applications. - -This boilerplate also includes a fully working example app, complete with a background worker and a front-end in React (with Aragon UI). - -## Usage - -```sh -aragon init app.aragonpm.eth react -``` - -## Running your app - -### Using HTTP - -Running your app using HTTP will allow for a faster development process of your app's front-end, as it can be hot-reloaded without the need to execute `aragon run` every time a change is made. - -- First start your app's development server running `npm run start:app`, and keep that process running. By default it will rebuild the app and reload the server when changes to the source are made. - -- After that, you can run `npm run start:aragon:http` which will compile your app's contracts, publish the app locally and create a DAO. You will need to stop it and run it again after making changes to your smart contracts. - -Changes to the app's background script (`app/script.js`) cannot be hot-reloaded, after making changes to the script, you will need to either restart the development server (`npm run start:app`) or rebuild the script `npm run build:script`. - -### Using IPFS - -Running your app using IPFS will mimic the production environment that will be used for running your app. `npm run start:aragon:ipfs` will run your app using IPFS. Whenever a change is made to any file in your front-end, a new version of the app needs to be published, so the command needs to be restarted. - -## What's in the box? - -### npm Scripts - -- **start** or **start:aragon:ipfs**: Runs your app inside a DAO served from IPFS -- **start:aragon:http**: Runs your app inside a DAO served with HTTP (hot reloading) -- **start:app**: Starts a development server for your app -- **compile**: Compile the smart contracts -- **build**: Builds the front-end and background script -- **build:app**: Builds the front-end -- **build:script**: Builds the background script -- **test**: Runs tests for the contracts -- **publish:patch**: Release a patch version to aragonPM (only frontend/content changes allowed) -- **publish:minor**: Release a minor version to aragonPM (only frontend/content changes allowed) -- **publish:major**: Release a major version to aragonPM (frontend **and** contract changes) -- **versions**: Check the currently installed versions of the app - -### Libraries - -- [**@aragon/os**](https://github.com/aragon/aragonos): Aragon interfaces -- [**@aragon/client**](https://github.com/aragon/aragon.js/tree/master/packages/aragon-client): Wrapper for Aragon application RPC -- [**@aragon/ui**](https://github.com/aragon/aragon-ui): Aragon UI components (in React) - -## Publish - -This app has 3 environments defined in `arapp.json`: - -| Environment | Network | -|--- |--- | -| default | localhost | -| staging | rinkeby | -| production | mainnet | - -Prerequisites: -- ENS Registry address - -Note: the `default` environment which points to `localhost` does not have an ENS Registry address specified because the `@aragon/cli` will default the value to `0xB9462EF3441346dBc6E49236Edbb0dF207db09B7` (the ENS Registry pre-deployed on the local development chain). - -### Introduction to environments - -Environments are defined in `arapp.json`, for example `staging` points to: -- an ENS registry (`0x314159265dd8dbb310642f98f50c066173c1259b`) -- an APM registry (`open.aragonpm.eth`) -- an APM repository (`app`) -- an Ethereum network (`rinkeby`) -- an Ethereum websockets provider (`wss://rinkeby.eth.aragon.network/ws` - to **read** from the blockchain) - -The `rinkeby` network is further defined in `truffle.js`, and has: -- an Ethereum provider (to **write** to the blockchain): - - an address (`https://rinkeby.infura.io`) - - an Ethereum Account (`0xb4124cEB3451635DAcedd11767f004d8a28c6eE7`) - (which is the first account generated from the `DEFAULT_MNEMONIC` variable, to use a different account see [here](#Using-a-different-Ethereum-account)) - -### Major version: content + contract - -Command: -``` -npm run publish:major -- --environment staging -``` - -This will: -1. _build_ the app's frontend (the output lives in `dist`) -2. _compile_ the app's contract (the output lives in `build`) -3. publish the app to the **staging** environment. - -Sample output: -``` - > aragon apm publish major "--environment" "staging" - - ✔ Successfully published app.open.aragonpm.eth v1.0.0: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ℹ Transaction hash: 0x3d752db29cc106e9ff98b260a90615921eb32471425a29ead8cbb830fb224d8 -``` - -Note: the contract location is defined in `arapp.json` under `path`. -Note: you can also deploy a major version with only frontend changes by passing `--only-content`. - -### Minor/patch version: content only - -Command: -``` -npm run publish:patch -- --environment staging -``` - -This will: -1. _build_ the app's frontend (which lives in `dist`) -2. publish the app to the **staging** environment. - -Sample output: -``` - ✔ Successfully published app.open.aragonpm.eth v1.1.1: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ℹ Transaction hash: 0x57864d8efd8d439008621b494b19a3e8f876a8a46b38475f9626802f0a1403c2 -``` - -### Check published versions - -Command: -``` -npm run versions -- --environment staging -``` - -Sample output: -``` - ℹ app.open.aragonpm.eth has 4 published versions - ✔ 1.0.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ✔ 1.1.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmSwjUZFpv2c2e9fLoxtgFrAsAmBN4DyQGJp4RcqQcW3z3 - ✔ 1.1.1: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ✔ 2.0.0: 0x74CBbbC932d7C344FCd789Eba24BfD40e52980c9 ipfs:Qmadb3hzwLDKtb93fF367Vg1epkdsLZF4dhpapNYynjgZF -``` - -### Using a different Ethereum account - -To deploy from a different account, you can: -- define a `~/.aragon/mnemonic.json` file - ``` - { - "mnemonic": "explain tackle mirror kit ..." - } - ``` - or -- define a `~/.aragon/${network_name}_key.json` file, for example: `~/.aragon/rinkeby_key.json` - ``` - { - "keys": [ - "a8a54b2d8197bc0b19bb8a084031be71835580a01e70a45a13babd16c9bc1563" - ] - } - ``` +# Kredits Proposal diff --git a/apps/token/README.md b/apps/token/README.md index fc42cf0..c698aa3 100644 --- a/apps/token/README.md +++ b/apps/token/README.md @@ -1,162 +1 @@ -# Aragon React Boilerplate - -> 🕵️ [Find more boilerplates using GitHub](https://github.com/search?q=topic:aragon-boilerplate) | -> ✨ [Official boilerplates](https://github.com/search?q=topic:aragon-boilerplate+org:aragon) - -React boilerplate for Aragon applications. - -This boilerplate also includes a fully working example app, complete with a background worker and a front-end in React (with Aragon UI). - -## Usage - -```sh -aragon init app.aragonpm.eth react -``` - -## Running your app - -### Using HTTP - -Running your app using HTTP will allow for a faster development process of your app's front-end, as it can be hot-reloaded without the need to execute `aragon run` every time a change is made. - -- First start your app's development server running `npm run start:app`, and keep that process running. By default it will rebuild the app and reload the server when changes to the source are made. - -- After that, you can run `npm run start:aragon:http` which will compile your app's contracts, publish the app locally and create a DAO. You will need to stop it and run it again after making changes to your smart contracts. - -Changes to the app's background script (`app/script.js`) cannot be hot-reloaded, after making changes to the script, you will need to either restart the development server (`npm run start:app`) or rebuild the script `npm run build:script`. - -### Using IPFS - -Running your app using IPFS will mimic the production environment that will be used for running your app. `npm run start:aragon:ipfs` will run your app using IPFS. Whenever a change is made to any file in your front-end, a new version of the app needs to be published, so the command needs to be restarted. - -## What's in the box? - -### npm Scripts - -- **start** or **start:aragon:ipfs**: Runs your app inside a DAO served from IPFS -- **start:aragon:http**: Runs your app inside a DAO served with HTTP (hot reloading) -- **start:app**: Starts a development server for your app -- **compile**: Compile the smart contracts -- **build**: Builds the front-end and background script -- **build:app**: Builds the front-end -- **build:script**: Builds the background script -- **test**: Runs tests for the contracts -- **publish:patch**: Release a patch version to aragonPM (only frontend/content changes allowed) -- **publish:minor**: Release a minor version to aragonPM (only frontend/content changes allowed) -- **publish:major**: Release a major version to aragonPM (frontend **and** contract changes) -- **versions**: Check the currently installed versions of the app - -### Libraries - -- [**@aragon/os**](https://github.com/aragon/aragonos): Aragon interfaces -- [**@aragon/client**](https://github.com/aragon/aragon.js/tree/master/packages/aragon-client): Wrapper for Aragon application RPC -- [**@aragon/ui**](https://github.com/aragon/aragon-ui): Aragon UI components (in React) - -## Publish - -This app has 3 environments defined in `arapp.json`: - -| Environment | Network | -|--- |--- | -| default | localhost | -| staging | rinkeby | -| production | mainnet | - -Prerequisites: -- ENS Registry address - -Note: the `default` environment which points to `localhost` does not have an ENS Registry address specified because the `@aragon/cli` will default the value to `0xB9462EF3441346dBc6E49236Edbb0dF207db09B7` (the ENS Registry pre-deployed on the local development chain). - -### Introduction to environments - -Environments are defined in `arapp.json`, for example `staging` points to: -- an ENS registry (`0x314159265dd8dbb310642f98f50c066173c1259b`) -- an APM registry (`open.aragonpm.eth`) -- an APM repository (`app`) -- an Ethereum network (`rinkeby`) -- an Ethereum websockets provider (`wss://rinkeby.eth.aragon.network/ws` - to **read** from the blockchain) - -The `rinkeby` network is further defined in `truffle.js`, and has: -- an Ethereum provider (to **write** to the blockchain): - - an address (`https://rinkeby.infura.io`) - - an Ethereum Account (`0xb4124cEB3451635DAcedd11767f004d8a28c6eE7`) - (which is the first account generated from the `DEFAULT_MNEMONIC` variable, to use a different account see [here](#Using-a-different-Ethereum-account)) - -### Major version: content + contract - -Command: -``` -npm run publish:major -- --environment staging -``` - -This will: -1. _build_ the app's frontend (the output lives in `dist`) -2. _compile_ the app's contract (the output lives in `build`) -3. publish the app to the **staging** environment. - -Sample output: -``` - > aragon apm publish major "--environment" "staging" - - ✔ Successfully published app.open.aragonpm.eth v1.0.0: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ℹ Transaction hash: 0x3d752db29cc106e9ff98b260a90615921eb32471425a29ead8cbb830fb224d8 -``` - -Note: the contract location is defined in `arapp.json` under `path`. -Note: you can also deploy a major version with only frontend changes by passing `--only-content`. - -### Minor/patch version: content only - -Command: -``` -npm run publish:patch -- --environment staging -``` - -This will: -1. _build_ the app's frontend (which lives in `dist`) -2. publish the app to the **staging** environment. - -Sample output: -``` - ✔ Successfully published app.open.aragonpm.eth v1.1.1: - ℹ Contract address: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 - ℹ Content (ipfs): QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ℹ Transaction hash: 0x57864d8efd8d439008621b494b19a3e8f876a8a46b38475f9626802f0a1403c2 -``` - -### Check published versions - -Command: -``` -npm run versions -- --environment staging -``` - -Sample output: -``` - ℹ app.open.aragonpm.eth has 4 published versions - ✔ 1.0.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmR695Wu5KrHNec7pRP3kPvwYihABDAyVYdX5D5vwLgxCn - ✔ 1.1.0: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmSwjUZFpv2c2e9fLoxtgFrAsAmBN4DyQGJp4RcqQcW3z3 - ✔ 1.1.1: 0xE636bcA5B95e94F749F63E322a04DB59362299F1 ipfs:QmUYv9cjyNVxCyAJGK2YXjkbzh6u4iW2ak81Z9obdefM1q - ✔ 2.0.0: 0x74CBbbC932d7C344FCd789Eba24BfD40e52980c9 ipfs:Qmadb3hzwLDKtb93fF367Vg1epkdsLZF4dhpapNYynjgZF -``` - -### Using a different Ethereum account - -To deploy from a different account, you can: -- define a `~/.aragon/mnemonic.json` file - ``` - { - "mnemonic": "explain tackle mirror kit ..." - } - ``` - or -- define a `~/.aragon/${network_name}_key.json` file, for example: `~/.aragon/rinkeby_key.json` - ``` - { - "keys": [ - "a8a54b2d8197bc0b19bb8a084031be71835580a01e70a45a13babd16c9bc1563" - ] - } - ``` +# Kredits Token diff --git a/docs/kredits-diagram.png b/docs/kredits-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..0114accd7f01503e75135aa6a9ae602f3b93d0ed GIT binary patch literal 15137 zcmd73c{tR6`}aR6OJymak`S^b3CX^N%1$ZS$rfcN`~D#_QWRxp5|SmdZ-a@6?6S^S z24l-Q*0Bxl*ZXr_*XR2FzQ6DN&wbp-abF!d8t<9j%WFB$=ksx%6Lnu#jsDc7Q!p5e zUPJwkJ`6_10E1Cb(^7*YoiR;xFc=q1Qp$0$SRy7vG6&1gNM|J8+ferM2ZV0 z6dzI%|E*PdM7f^4(ZTN7DRxUjVm6^GO(tHOzj+x~R#iPVGGcNshP|zfq{W?qv76OG-JrF z>i!O~=PkGDRUsjppKrP4kI9>+fiZFA92~UrnjMnE^HKDR@e`^w^t8Q`mlFROjvNONbIsq2)$xvPva^(!_Z}zdkW}e3^85=)#?#&F8(DC zqOD0SezrMo_T`HXJoOmmaw0h`X<$9_@$8vQnUY-x{D!uEi^rtRZOe~;B)xZ%%MYzp z@4I1DCt^AW$>RN&zKRBucki2+T)I)e)d!2n&G5g5T5n;Siez)4Ep9yWhsNjj z?od_3`Ae5BHT8rXZJODH>~Afs@c#jg%)`&x&q|gTa*+(TjZnVsE;y0k^=LN|&K|BM zQh&?Lcj{%$>}i%8XKwp0*_mZ6?Mswy5A}!qZb^}P zJ{?97Bqx`?CInr@&7)Cv_Ee4PF+p1RjpjIKc-1wYc&89kn${25=0o1k&`*UeP}1x{ zTfeLp2l6Or8}|o`O$w1Ro=;&-&vMf*Tn6u~#fFf1U{*tg##U2JFEddndF_;2f`#UF zlJ64};b5uDT{rs1mG+`fgM#+-h3mA@7lcn`-FtJ2P0Hnr&zQT~RS^+JXhHcdm$WwZ zW~w%C_9$^)4k53@BGfMXW$SQ^YOz0m{#@nm-MhXUZ33#a+yleIaGqHCoAMh!d8S^n zSkUI=(sV*_GIZ)z%B4v^S}-Q8Wft>}a!`=j)~MZRO9Z%Jt(6a3N$23p z_rLJO5C1^Nw;l0BwRMErjwfTLjP90u`3o$Shr7pwms6!Gg(%La`&@?kOaw{M)6)wN z89sXCHf-)A=D+3eStqr{z|j21yyA`wgWR&HOWlejbS#cf>q|kwbgt5&AhZmj|2jK6 z8^Lt-M$C@h@9{dRR(8)bK?kJSwPr^9!F&T4h(3z@zhX;$*R9(-I!@;Yczbw)XaW|W zES$spVsj+D&D!L5c@owJwzW7I{pr&u1_2cj%Z9Z5{rx{BJ)Z@t~XEKk0X!cQI@5a$z2QvzaCY2PO# z^ku1$T`lzWnMsrSUB3=-^eL``yH#}6ujZ!i zdPaFtGf?HnZ8NbgR;;iKq`tQeZGNxnfF4PwA~Z z8nH~loI`Irx)PsHF5`mZ~X^LUSZ)(7|rF$jDXdtE~$y^ zPoMt08+~CN#GkUetYA#WyhokW+?wcWFzRu&C2FBB(KiYAb2zCuSD%d5BQ`JjpMzgs zQDv_zkHfz030{!!_CQs%H6Dg_gpNn4evJ9NazC$di2fj!-^-5&cPu}7>&c0dovD8G zZgy}qA`0{KvE3FIDTy34hf$XkJtk<%eap|!ANz11-XkCXP*>(96bPNL-zX4$f*6Gl3Py~9SIa?!sWO=6_ zd35VFo79b4w{As@jEuP9>=G-k&i~|zJ)@Oy9e2Ui5$@(uo-N#u_hgSe2Pc{-r^%D+ zP}_Xyo@Ynh2XdlUjdyUUSxWljzx{;o{t)q8R0H z>WV5hrT`9*X0HkgW&$BKSYSxylqeumY+M$(xcK~4bhMz5(CFvZ=XxH&!SA;-9jba#)5;?Leq3`n)^@XV=`jiz)eZ+jh9{TY2JAJ%Vlw0=qz=vi}PK`+z4{ws6_-WAw$hl9Jq zUKrm8+^<>AH~GHHcDZqUE!NQIeapWOaoi?BhstIC`Uvz%jm5cALqAk)R+rU(xy&$g zb-3@&DZw}YWkloZIUIlYnK%SsQ>yS17T&@Cym(#T*U6l8O?Ofv6S)X)Y4@ z=f?`o#3vP}Xy13`hs)RWViLeo+`63fAG(SDxvLG_4GlknAVbe42@`djMBgZS<9)($ zsE|A2wuS~>9kC(6&`>Ro_gP|Zjsip3)2>h1*%2Thi8=IgLAlui$oQQ{b3n-Uq)0fP z8p*A!ObBO?{W5tt^wqQ#C?4}(#SxE!$6pChgr%ZkuRe50(a z=UZuM+&dn%J}mZUx(~h$2r8rdI3Oy4nhxFH_kZr_hy%g?bc~oY+r(bC&rjQ%!ofEh z$sR!R3=A4L4tIz&b~YTWcIRr4?>0>L&o-JRj{9?pKX3Mt%`{aoZ)%@;X}!b1$}U@esjt8)xb0- z%lmCyNF2r4SNA9$xQ#kjJ$Ur!4zPmX*Uzdyv6@2F~@&LaZ@F?Yh9 zgzLsl(DO{kDs^)nto6b zks8NT3|naN$6Jwi*HJ*ejJ@dB84Ec+Obgs-gG@TmCU8^N`VXAsNt(bpapV-FkAVv8 z9-RJ8!`WGX6SN6Bjr(^Jql7je9{O0T`3Z2KrX>vbI2utBrNWVmtS053~jP8HJw15 z<-xi(9!gJ!QvJ1jb{da^R_k{x@(T)*!Ba3Q?s7qn<@=u}(_4l@j^;x=`gNq^i&ZJYw``}wN0p5opNDa7W{x5J$Y zBq)Qp$4{rqI0Q)3WkQGm#-99j14bjuOl_7`$Jfp?%T>_B#mD==cSJtkropKZUb`DFk>oe(y-U(G= z8nw&q8dJ4dcp~ZKGEP^a`=`(j<;SbWc>KC%D3U6d z>R5XyNYdCRpmaj@w&0r0BxZ&j!^N*&78jI}ZAWZ>(B@51&5A8B@C%@{LDb)*sAj-^ zP4|4ja(eWkot+(|1Pu%fI9xVI9E(qKLBiguEsk%hu&n!3Gn|oedwbhzt}~f}cH(f= zr=ynDIc_uW)FK5RevW|Txp!{5w+VzfngQf#+8(w<%H1P*frSM@ z3?LvOLqC;Z>O%JytN2n_cm^`=AO_Xc#$J-R<}_9S0eOD;?SY4>1`|#Sl~RO| z1`bIJKv-UjchgFZxv9dJ9G^dLg6`rZiy4ze$lDx;n47_-ZH5pJq`1GijMski zT_+3>JBvz%FdcLGd3kL?$cWy(i4s=vrxAG%b0aGphaKnx3skU&v1n$5fG25 zcWRgEs__1fRd1rYox*(=RvCCD|AfQpL-A;%C+4NgF9-n}rcZ9ICC_ZTqt&f>4vs17 zsCp=enV4g4JFRghzgOat!7re-%F~ionWQU@zdM<{AW7iSB`mz(ph0rq4A*& zw*)R6D{J#+oN(bKeMw7q8jYQ^GGz``joYj#HSkl7b5^8y{d4r*c&GOv0h^}uCz#WK z-M++z_W||ZDMpUAvjmGiW@GjCz)K7c>c)Y`SX#& z{ijPM^(D+?Dk{@FgUOfY7)@bEkqpPGL)Int?$-dqKp49b`q8$Av~`!7`mq zwCw(2d1Rk7?y|Qr%N>z`+;$D#OkI298kqHC9a!{c5Vg-oGIHXtxc_V@DkwM&Z8OK= zBIlAoEt`M<94mpZ3$juEo$k=)1c6DjC`{57k782scd}y!tn*8L{wZk6fT2G#-5Sd% z{p>!;A2P!^RF^Q^ zE64lLV?djUFVXBA7#-mH(n5~*rt%Al+E>JVR>$sJSX>4)jv4F^4;CZ{#3}${`hxsh zInCPOGsv(1-wl~c!jh-Ac z_v;3n;ux2YI*i*qcvO1Ke-$Pq5&kL&{oleb}L) zhvw#8=MBxi1H)}p>BI_Qw~hp18vyBVqpX@->VDwY=Q9F|`mz2XTp&${bM-i(WaR8D z3~{lystj!$Wj;ha1gQYK5w~mqqa}tzt0zODX7bO|MitM`|M>Bv(5U231rjzqLm|Ke zglE^Dsyn8}BgbB$@XP)PaP}A|di&f5S`-REE{IV;Lck5EuDU*z{9HOA1aiRWUT68q zA!fF*1DI;mn<-9awx6s|PWIkmkMlh7HY730#9HsJ*qXekupp79O|b&)8u~Ca41<3y z^EC!3ypxBr6Ax9>k18lWm!0qZGl*nht2d5U`tNUFYK%f^AyO{JcgEs#onlx#AqJLukq z79Owko7Sn!2WbeR zs6cV+D(=}XE-gW{ja4yFdV)MBv~%|Q9y1oHwaIcorCc>tj%_5>Xo!;rIDOufspc43Ww{ZwFpBt=1#A->F? z!V5#a_Z?%Uc!+qjR5-y57fz=m3(M#R%rdl_dds^vDBHJc^<%qBsY2z#VwvM#_o2K# zlrJk>qzJ4r@CypXwKedB{y^KN#Gm#mxuL=Czq8r}0!EYHe0rEPV8HUVsY1h`|Rdg(elRfLv_Y zOefA9?Xs}2h(GJ&1z{!$&~Jc{rX!ejKZ2=+@Z)k>PpS8cNw>m|8EMS3#|-D%u*VO4 zkLFj`rR+N|Wmc=Fe~(s)*r&NuL;DC~o?!OoN;_^$FBTL(1w|-`#L-;#g@yWU&bjv} z?1(IzA)UUuNGkHeUx6dl8uVmRL@`Y%pFppmm`+ zU;TWl^>V;<2>IsczXAoo4~7v!*DAz379qNIz2g-a%S72N7rLCZ~>IFXk?V(k(?|(^8Nk=X88GvgmlyO$ED*^ zal?F=jJK|5nLm!l@3Uj`Q62>LsGEefoJNX(Z%g#_D6mIqze*A!&2Tq-~{3(1u zo>%Gtntq`_ml3KiBwF|jokrg8ey}v|-UZ1?393!P z+k^J|kxw^f+LnRc*;*Qo1#;!WI7$ldYqQ!g0&D{df&&*P6q8;c10n#l-_J zy%wbx_@_NGsIqy#vIu@^7zl5mRGS5J)0%=0Bti_wfuRi~l_5_O(i2>rT~94Vvrt7A21*d$+1h(4RS|2Ti$tokjmcw8-AU=l{R zJf6l58nZjXnL_hX!%7q}{G=1N*%vo0F+!U}sv{aB)ifTl57H-|Q>}O3q3QE*xZhxk z*gRj#$h_}5=}vIVB*hG8n1H&K4hA3I8an0IL6N`&SFTS$HT=$?s)WHVjX}KtXN^vd zsiuV1$CtUnMbj}3f!TFLS^vbZs<)3UnE!U3Gc2kn@HbLdSp1W6U3hLBeFK*obwh#fkVLip${ zh~F8XKY#XS+vE6QD0KGtrw<(Mx)(F=1QADk7&eefOoP#UsR5R*|^!u06O0^c(G82YFXS+4I3u{3qe^ z|7-ldPLtp!|LwxAX2Gl_1^%RB#kgbkYUkgywY<6gh1bc-ER&BEUnr=l3PSO>MLuSq zUdmZ*`};H5E~_`6Ff(lgKM(7uE7f1D{5O~#p%~~TMVl-l{${Wm<7P(&my1`g{u|3` z$b~LLha5cr0^bn-jvMH*E8g(+QcG?AFPAA2aHCmYJ+FW1A9Dp}r;mXzKyK)-iTozv zTJMNjCjax|-Z`ew2o2}*m^ zT-xcf5&#H7H7~a|zQhP%Ab|Ni3+m;~piFr2vv%^i&^5qMytWsd&O05BvUzU{I!m-@ znYL)PzD}%sofyL^;_Mvm`)=T5?S7qY0hIW6J1mdRU1DQX1(mlXS+D1yZur8%!GX4M zugewERV@E7V<5PTLghB_oI+3s1eA3m{%Uu*DE?F%a;AnE?T^DluyVGjay!(EPTyx8 zz6(j~eM6E67LCzgx>Aqw0KpT;@ck3?)Ihoo(rlovs{u$|US1Sq@LG7yf%?wMs8p3D zutBPkXDA3kpBbemVc-U8XV}XR|6TBkq+oV&H z!@f?$C~{PLvb`TQaU}$JIb_PMzKCk(Jl<6c-s`X|wQW16LJPGKKrj;qgmgHBQ!2Y` zZ$g3?SQE-#EH=rs%4J*@MDoTUq2iV9f33A&k4Zd}q0UBl(I-Anx*p57khb{UZuBNq zPCYK2m%J)YwcK18QtMArSTz0}BWF(d_N@Q&*kB5v$Qyw5q(XY(^Jjj4(sG;Eu(=xG zxS;FGENFW$4Xg(UlmkTUQoFzp9@rPO3DhhV)$RUPQyLk}&2s*G>z#G`W9^zdVyFv^ zw%vnoCg@R7^K}SNPKR0YF5TdD_ZK}6G?$GGDo)v0Y@&SsCs`EDyef5{e?VXsR-o!5&C+{wDobY3Zg`w;DnAa$Iw>{-JWGHRz9|V{S9gd5YEHh zri1#MsF++D_U6WH%a`>)*8Hmr>88n1Et@M!Op5eE4Q})He^{A`tIIILo-UW>rOOTEg`#=(FM zS4^a1<>{3zlqXVE+x8wTk%_HAHIyp8G=VCYZ+_?AMn>>;W1s8pU;4^0ksJ1Lv#or@ z<^uF_SHb*-E%NxI3~Lw`aV+Z`Bq&ITNt;b&}kS7o5)F zo6hlU(b8(sntz>`0CdO;d;9*dKcJLY$wS+8x-Z@ZJkUU5U@K!*LD2j2OQT-VZR z!E4v7i|bS7Nm~od6S;tUjqUb-(jm)DCG4#DXY0%Q>iD@XLevHl~L|>wlGV|R;uW@=`$37e zk{vqwHvN6%^@G!EOlv9|`xhqR82kwYar!J~O2@e3cJWML^d_l`VS2%-FvQim`JmOW zW6{L9-=dyKlflC;T!G2dDdw}I?~y|mlBYDY5bLFaejK60&sOt{Q>uz0FDmhN6ln&R zK4xM@<)eZw#mk;|%GG9<@;naW;w(4~0?xUjYG_`oIjwn^QKNEA(5hilq+3&y}VOT1nX%VYs zL1ZLHOQU|PwbeSY8iS3}E&1mr(P04T`=h?%0O3giZYXXR6V)PwFgzOOYu#g7&-Y!@ z_<0!Rsnnpn?6u2DAcrgQE=f@om=2a1>i0x?FUIrp9&ERnCZwC04QSM-B8Z!bQN*4Q zzS;M%5FXOv7Fb)alWc9_-ogU9k9$bVwg_VL{)|^J`S$CuOV-2|sW9ZZ(Os&j<|&eP zWn0Vl3wm4=3;b$6PeBcb-QQsp{{;koUHSDpnwpxm|KFi#VkhvcqoyQ@m#>UO9*D~0Nz$5s@(v&`G*=P|KQW^X~Et{ zl$eaz=hiA~J|m41%k~K7XtuDE<;(Tl#)_#)%V)F~{lwj?e^JZ&Tq{vVx-z?oh>&aPfd?K|qW7|P!Zk(MX;ti=4QP0oB zhKWYBJ@!^YD4d?i_WROxb21BaM^G+sNdWx|vvY|MfK+-RXer#Kz;6>pH_-gGa*u93 zsFQ)NHaw}YeiU#-{1x5cVx9&=Cbo6vs7*00ey-ND6U5u>`sHcZpT{;99J+iA584|z z%QlAI=#Y+2y8D_)W+v;U_133ITkSX4?wMJC`sH8!DBo!)rPFw1Z*XYH18kZNfSmwm z8w!lk-1#8?#K95IjP=Duv5J^>`{J&>PE5y2A`&^2LkKce8S!uHPcC>!hS2KJbxjYL zvfb8}FKxx8&(+Y^on@HPwfVzQ~Tj!utrg>3oW_5KEAXvjOoP$rr{^h8=Sy$d{ z!m$XEEh|S3K6>27#;lY}K|HccxcD8GtEZi$xRveKtsHEFLP&4rBvrl{RGG0%CTdSV zb*ZYMQyo%6#8;gbcJ*9JcMaO-UkP?$wWf^EoV9;noYnKhGX|IEBGYO$+x`J+8N6;> z%3B5Mz0Uwf=Ll^)Tycfa$I;<|xZj2?(8IX$XUxn3x-+1NZ3`eY)Spn}Ij{ft@juJO zIkmMZAfAJQwwk&5@;lT2RzHu?!2bX1=QVOqW=6+W%2)oDvihetqc&+wM(?o4PV8%f z3?A~VLHv==HiH|tGrYpt(A?+Yy!S0h$;jy#xf^5vxEQ%_O$_^Yr^!q~iWb&XXk6CR z^zt;+(VcYbnSL~UZVYsDX95lbvjR8=dhr?*HOZjI@Qj3ngca!Egqn&`054O}R*id` zLe1>bONC`k0P{h4esxOzzn56YJ{P6dnHyRQH1^c4mwK^^v}l3un&})SP<7$;3M)Fg z@oX9>c{%{wpzeCeDxBevy#*>Ba8L?TGV>ZVs9BloPG^IR3ZO4g({qxPs|7801fN#I z2`>4qUe!!cCWHFutw4P&6Nuz9oQm=QcDw}N8BhpZ(6Vg*Q1Rc&Ze#0Z+pJP9W)4nH zP7ivz#*2hX;*YHuzx(1+{<^uA=yiRBGm}VMWtNM~Bf80H&SPoNrELwMy*wazf!hU^ zIeJLN_W-4JNesVjvjx2-pkNFTvgG}T4}l#Lu3M>OgK_SnX@I>sWz!myW8afu=Jx$0 zK*iS#gK5M5uJPFYPc@ztR}EBf&}gPrYF&Dz@V`?1UAa&^M&L@W0)?Mv)#&4c#^LEL zenpC!-a5K86%^Y;!^(gi9^HtEJ~{3`m^qyigN(+zFsAh`hU1d%Q12(Gv)Kcb2X(Rl zYeNnY|if zj2r!Bi>NB@Qbf2&r68;8$6t(MK=H{9?>FxbOldFpItN%v6w<(ALB#<;uRv>e5mY?{ z-y={d7~QD{YY%GJxDJ}PLH`iqSC(2CnA_#AlOA^FfV2XKOSx8tJbVq>ROVuGIN<++ z1fNzWnK8NaG?Ok*h_-uo2;q&v?+WW)&(XZB7r}YUxY2Vc^%j(^kOUMNxtNNd*t@## z6EX0b@wCE&vn81$Bk;{d1z}u>4`Gv=;pgZoD*CQ&?dcw8cv>o^uBPToYFKT{ArSZSH!u@D}`a@W-I^}6j9 zqga69!Ir35%r5|K@dk&BhK=oDFN0t)= zt`AZ^t7f44KA1CBX6_>R&W1jaoK6Y<2Hh7%mC4N|fYpOu*g2P6=bpbUtmKv=fvToK z-N`oiboJTYbL(y0Qv6G++>$Ri`4zL5#U>vR#$N}&eLv{WpmD5Q$#xs1)n_}YNqG2? zNY%o-1V*QC>pMn3fQ4_=c117HySWCFYip?*_!}6a6_r-XVy1wr4Gd;?oYa*x1Cwx# z2*$ioj-=A$`FM(My-K306ZlRJd-C;T)^)4r_OQk)ig&)!?wW5LDF=Qr(ebdDMiBSb zvQg1d^jjO*44z@Cp^V=5iJ;E6n9Ia=KqKIlM6*mq4o{+$*XW?B^x9G+vv7pWDd}~u zz{{82{ouPVe$zxLNLcbI`nsgzz4DfxYC30v?j1PzaUJpom71qt^70nkQh|4Y`i4O% zx>2G4>-_DswuQD0%1Lqhhp%A7x;5$#Yc@fPM6YQ7n z$EPu-57aT12p_7HUY8sDBH(uBo2ctS3u;162;^#cQ||`_Ud2?gOz<~fc^TSFIwkv@ z=OHz?LfJxL$!)RF1LMr~I}@O`QvRGUxUjt6B8)9Mv1_{FYDpN}oDQ8wG@I?uJF_9) z5Xrn*anihk1+*8_*gYlOSk{Y_>?y?Kok>?>=7}0kyhN(N80_SD+9r-YOggGo4`1r! zcNaswe}JIhQbenTO$aP)_Q11sCBO}r30xoIKd_gWImAEkb5wUttqOLfEZN~cu$a&u zwRJ0K+m@cu>x=9AJH3zmc+bT4fyl)6UW%{LXCQQ$LS6^;NhwA;`1o|WQgU_K$^{C} zD-4-_G1AGq)P&wd|4Ds9HF-G7lkIZ$EOy@ylkpC;-4l+P0{Aa5vy~ldq0Sv$>N1>} zr$}Uqe^r6zCG@5jJJ0Po#mExUUgu#l(k`QS;x>&koIJ0)Um;ClWEgnjJ&U*)%4$XY zl++g|9@O{z&c3{J)|Em|NN~Cd<;C$~r-q?@QCZvnRTQ$v)31Y@MDA1%<{Z*U2W-2X zicNDfJqoC3Hbi_Bkyn@8wa@C#Z~{}eW4n{Ax{2K%k{w+gLwPMBn$5YoLqPv-N0cXQ z16ll*TQ|RZVlLdTbp^@3H0sw;>cic>y6KZboGF)?@Ar>s&blR)!Kl61i=5M#!fgaA z2Z{tR35d@lM~(ds;E$D%nt49KL8aRrAtAwUt9ptNo6`HaC`OK;xgTgJ!u+k!gp#)! z?Z;GdYqw4SR+}Sqg(Uf&x46t^zJDvL=6g-fsNL`^CsCV#F-0`{$SzT{-)4W_U)w;1 zcthCmCb1@w|IqIdexS)7H(*k1YkqY9(^(ANfC2(}m*`De`hrhqRcEIj`c