Thanks for taking the time to contribute.
- For anything non-trivial, open an issue first so we can agree on the approach.
- For security problems, do not open an issue. Follow SECURITY.md.
Each repository documents its own setup in its README.md. In short:
| Repository | Toolchain | Test command |
|---|---|---|
wield-contracts |
Foundry | forge test |
wield-sdk |
Bun | bun test |
wield-cli |
Bun | bun test |
- Tests pass. Run the repository's test command and paste the output in the PR description. PRs without evidence of a passing test run will be asked for it.
- No secrets. Never commit a
.env, private key, API key, RPC credential, or server address. Only.env.examplefiles with placeholder values belong in git. - Scope is minimal. One logical change per PR. Do not mix a bug fix with a refactor or a formatting sweep.
- Match existing style. Follow the conventions already present in the files you touch rather than introducing a new pattern.
- Contracts changes need tests. Any change under
src/*.solmust come with a Foundry test that fails before the change and passes after it.
Use short, imperative subjects:
fix(vault): drop uiMultiplier from stock valuation
feat(sdk): add basket position helpers
docs: document blend exit flow
- Solidity
0.8.24, Foundry, OpenZeppelin v5, Solady. forge fmt --checkmust pass. CI enforces this.- Follow checks-effects-interactions. State updates precede external calls.
- Guard every externally reachable value-moving function with
nonReentrantunless you can justify in the PR why it is unnecessary. - Prefer explicit reverts with custom errors over
requirestrings.
- Strict TypeScript. No
any, no@ts-ignore, no@ts-expect-error. bun run typecheck(ortsc --noEmit) must be clean.- Prefer
viemprimitives over hand-rolled ABI encoding.
By contributing you agree that your contributions are licensed under the MIT Licence found in LICENSE.