# RAD DAD
### RAD
* Build as fast as possible
* Seperate business logic that is common to all apps
* Build tools that help build tools
* Developers should only have to worry about BL of their own app/DAO
* DAPPS are cattle not pets
* DAOs are new, nobody really knows what works
* We need to test coordination mechanisms instead of writing the same JS over and over
* Web3 dev is hard but it doesn't need to be.
* Opportunities
* We use same API
* We interact with rpc
* We should be using the same models
* Able to use permaweb (IPFS) allows to build in new ways
### DAD: Distributed Application Development
* Build tools that tackle common challenges of DAO dev
* Encode data for a multicall- refactor that somewehre
* Distribute logic over many apps
* Build smaller apps linked together
* Prototype fast, learn how community coordinates
* Reduce forms, on chain TXs, fields, contract interfaces into static data.
* We don't need to host static data
* Apps become interpreters
* Frontends have a new way of talking to each other (legos + permaweb)
Why?
* Life is too short
* DAO dev is very challenging
* Multicall
* Polling subgraph
* Sync multiple sources
* crunch numbers with tokens
* Interact with rest of web3 & protocols on that chain
* New contracts for your DAO
* Endless forms & integrations
* Not displaying data is a severe vulnerability
* Need multiple layers of apps to ensure security
* Visibility & notifications are important
* Most rely on frontend, won't check etherscan
* Every DAO will eventually need its own app
* Every community will need its own mechanisms
Links
https://github.com/HausDAO/baal-shamans
Starter Repo:
git clone https://github.com/HausDAO/dh-v3-vite-starter.git
Claims Shaman:
https://blockscout.com/xdai/mainnet/address/0xbC9364441E42f3bbA5D5bB9A6c113E6D46026c14#code
Free Ryder DAO (admin interface)
https://admin.daohaus.fun/#/molochv3/0x64/0x7e72ba58d3d331d339566db9ff3ec184b293477d
Free Ryder App:
https://freeryder.daohaus.club/#/
Free Ryder Code
https://github.com/HausDAO/free-ryder-dao
Presentation Slides:
https://hackmd.io/@daohaus/SJ1wg5yui#/
First piece:
useClaim.tsx
```
import { useQuery } from 'react-query';
import { createContract } from '@daohaus/tx-builder';
import { ValidNetwork, Keychain } from '@daohaus/keychain-utils';
import { nowInSeconds } from '@daohaus/utils';
import ClaimAbi from '../abis/claimShaman.json';
const fetchUserClaim = async ({
shamanAddress,
userAddress,
chainId,
rpcs,
}: {
shamanAddress: string;
userAddress: string;
chainId: ValidNetwork;
rpcs?: Keychain;
}) => {
const claimsContract = createContract({
address: shamanAddress,
abi: ClaimAbi,
chainId,
rpcs,
});
try {
const lastClaimed = await claimsContract.claims(userAddress);
const claimAmt = await claimsContract.perPeriod();
const claimPeriod = await claimsContract.period();
return {
lastClaimed: lastClaimed.toString() as string,
claimAmt: claimAmt.toString() as string,
claimPeriod: claimPeriod.toString() as string,
};
} catch (error: any) {
console.error(error);
throw new Error(error?.message as string);
}
};
export const useClaim = ({
shamanAddress,
userAddress,
chainId,
rpcs,
}: {
shamanAddress: string;
userAddress: string | undefined | null;
chainId: ValidNetwork;
rpcs?: Keychain;
}) => {
const { data, ...rest } = useQuery(
['claimData', { userAddress }],
() =>
fetchUserClaim({
shamanAddress,
userAddress: userAddress as string,
chainId,
rpcs,
}),
{ enabled: !!userAddress }
);
const hasClaimed = data?.lastClaimed && Number(data.lastClaimed) > 0;
const canClaim =
nowInSeconds() - Number(data?.lastClaimed) >= Number(data?.claimPeriod) ||
!hasClaimed;
return { data, hasClaimed, canClaim, ...rest };
};
```
With every new contract, we should be creating reusable tools.