Update all READMEs, docs.
Signed-off-by: T-Hax <>
This commit is contained in:
parent
f6eabf259b
commit
28f4fffb53
26
README.md
26
README.md
@ -1,25 +1,27 @@
|
||||
# Tornado Cash SDK
|
||||
|
||||
SDK to integrate your protocol with Tornado Cash.
|
||||
A general purpose SDK for Tornado Cash interactions.
|
||||
|
||||
[Please check out the docs here.](./docs/ABOUT.md)
|
||||
* [Please check out the docs here.](./docs/ABOUT.md)
|
||||
|
||||
You SHOULD familiarize yourself with features [still considered experimental](./docs/EXPERIMENTAL.md).
|
||||
* You SHOULD familiarize yourself with features [still considered experimental](./docs/EXPERIMENTAL.md).
|
||||
|
||||
You may also read, [a note on testing.](./docs/TESTS.md)
|
||||
* You may also read, [a note on testing.](./docs/TESTS.md)
|
||||
|
||||
Contributions are welcome, we are here for freedom after all!
|
||||
|
||||
See [HISTORY.md](./HISTORY.md) for a development log.
|
||||
|
||||
# Package `md5sum` checksums
|
||||
# Latest package `md5sum` checksums
|
||||
|
||||
If they are not correct contact the dev, post an issue, or yell in the Matrix chat.
|
||||
|
||||
```
|
||||
ecfbb8a878d31a163f6569c0aea32221 tornado-sdk-0.0.10-alpha.zip
|
||||
05be559908957e0f4961121537abc25c tornado-sdk-chain-0.0.9-alpha.zip
|
||||
bbc6bebfc9a36b022b5236da7791a234 tornado-sdk-core-0.0.10-alpha.zip
|
||||
3afd4ac753d27d2371623ba94f0c17aa tornado-sdk-crypto-0.0.9-alpha.zip
|
||||
d250fbc88e1e55b26f26179fa12aacb9 tornado-sdk-data-0.0.9-alpha.zip
|
||||
8cee3f65925686ea397d2c20f567be1a tornado-sdk-utils-0.0.9-alpha.zip
|
||||
49cef79f2e800ccaab5ae54f67dad124 tornado-sdk-web-0.0.9-alpha.zip
|
||||
19ca2e85b680d6605e7b3c39e9acc791 tornado-sdk-0.0.11-alpha.zip
|
||||
168bcc32bb6f6973205413ebd685ad55 tornado-sdk-chain-0.0.11-alpha.zip
|
||||
a2facbdf22e78bbb3de0d0cf6ad86280 tornado-sdk-core-0.0.11-alpha.zip
|
||||
90c3be466ab4fa4795377336ba7f0e67 tornado-sdk-crypto-0.0.11-alpha.zip
|
||||
0442a6f42ece8615c4d6b04f2d00f4e9 tornado-sdk-data-0.0.11-alpha.zip
|
||||
2b79bc500ad061c518c3d369e85e89e6 tornado-sdk-utils-0.0.11-alpha.zip
|
||||
faf9dc39b0fbbb06f6848ea9217a1b17 tornado-sdk-web-0.0.11-alpha.zip
|
||||
```
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Functions which are still considered experimental
|
||||
# Functions which are still considered slightly experimental
|
||||
|
||||
Ranked by danger.
|
||||
|
||||
* **Core.buildDepositProof(s)** ➡️ because we still need more testnet tests. Nominally, should work though. Use at own risk. Very very likely won't break.
|
||||
* **Core.buildDepositProof(s)** ➡️ because we still need more testnet tests. Will most likely not break, but watch out with token withdrawals, until we have a testnet confirmation.
|
||||
|
||||
* **Relayer.handleWithdrawal** ➡️ because no test relayer has been yet available to handle this. Will likely break.
|
||||
|
||||
|
158
docs/USAGE.md
158
docs/USAGE.md
@ -1,87 +1,137 @@
|
||||
# Usage Examples
|
||||
|
||||
### Build a deposit transaction
|
||||
### Make a deposit
|
||||
|
||||
```ts
|
||||
import { Wallet, BigNumber } from "ethers"
|
||||
|
||||
import * as Tornado from "@tornado/sdk"
|
||||
import { providers } from "ethers"
|
||||
import * as dotenv from "dotenv"
|
||||
|
||||
dotenv.config()
|
||||
|
||||
async function main() {
|
||||
// Get the core Tornado Cash logic.
|
||||
const torProvider =
|
||||
new Tornado.Web.TorProvider(process.env.NETWORK_RPC!, { port: process.env. })
|
||||
|
||||
const wallet = new Wallet(process.env.PRIVATE_KEY!, torProvider)
|
||||
|
||||
console.log(
|
||||
"\n 🤑 Balance of the wallet on network => ",
|
||||
(await wallet.getBalance()).div(BigNumber.from(10).pow(18)).toString(),
|
||||
'\n'
|
||||
)
|
||||
|
||||
const core = new Tornado.Core()
|
||||
|
||||
// Connect a provider
|
||||
await core.connect(new providers.JsonRpcProvider("https://some.rpc.url"))
|
||||
await core.connect(torProvider)
|
||||
|
||||
// Build tx (synchronous)
|
||||
const tx = core.createDepositTransaction(core.getInstance("usdc", "100"))
|
||||
console.log("\n 🌪️ Tornado Core connected\n")
|
||||
|
||||
// Print the tx to console
|
||||
console.log(tx)
|
||||
// You can set something lower here, in case you're a poor bastard, like me, obviously xD
|
||||
const instance = core.getInstance("eth", 1)
|
||||
|
||||
const tx = core.createDepositTransaction(instance)
|
||||
|
||||
console.log(`\n 💱 Deposit request created!\n\n${JSON.stringify(tx)}\n`)
|
||||
console.log(`\n Sending...\n`)
|
||||
|
||||
const response = await wallet.sendTransaction(tx.request)
|
||||
|
||||
console.log(`\n Response arrived!\n`)
|
||||
|
||||
console.log(`\n Note: ${tx.note}, you need this, but it will be backed up!\n`)
|
||||
|
||||
const receipt = await response.wait()
|
||||
|
||||
console.log(`\n Receipt received!\n`)
|
||||
|
||||
await core.backupNote(instance, tx)
|
||||
|
||||
console.log("\n All backed up! Load with \"core.loadNotes\" next time!\n")
|
||||
}
|
||||
|
||||
main()
|
||||
```
|
||||
|
||||
### Build a withdrawal transaction
|
||||
### Make a withdrawal
|
||||
|
||||
This is _still_ considered experimental, I will flag it as _not experimental_ after a certain number of production tests.
|
||||
Goerli withdrawals for ETH showed to be working, but I still consider it experimental for ETH and definitely for tokens.
|
||||
|
||||
```ts
|
||||
import { Wallet, BigNumber, utils } from "ethers"
|
||||
|
||||
import * as Tornado from "@tornado/sdk"
|
||||
import { providers, BigNumber } from "ethers"
|
||||
import * as dotenv from "dotenv"
|
||||
|
||||
dotenv.config()
|
||||
|
||||
async function main() {
|
||||
// The address to receive the funds...
|
||||
const receiverAddress = "0x0000000000000000000000000000000000000000"
|
||||
const torProvider =
|
||||
new Tornado.Web.TorProvider(process.env.NETWORK_RPC!, { port: 9150 })
|
||||
|
||||
const depositorWallet = new Wallet(process.env.DEPOSITOR_PRIVATE_KEY!, torProvider)
|
||||
const receiverWallet = new Wallet(process.env.RECEIVER_PRIVATE_KEY!, torProvider)
|
||||
|
||||
let initialBalanceOfReceiver = await receiverWallet.getBalance()
|
||||
const initialBalanceOfDepositor = await depositorWallet.getBalance()
|
||||
|
||||
const zeroPointThree = utils.parseUnits("0.3")
|
||||
|
||||
if (initialBalanceOfReceiver.lt(zeroPointThree)) {
|
||||
const response = await depositorWallet.sendTransaction({
|
||||
to: receiverWallet.address,
|
||||
value: zeroPointThree.sub(initialBalanceOfReceiver)
|
||||
})
|
||||
await response.wait()
|
||||
|
||||
console.log("\n 🤑 Funded receiver wallet to exactly 0.3 ether \n")
|
||||
|
||||
initialBalanceOfReceiver = await receiverWallet.getBalance()
|
||||
}
|
||||
|
||||
console.log(
|
||||
"\n 🤑 Initial balance of depositor wallet on network => ",
|
||||
initialBalanceOfDepositor.toString(),
|
||||
'\n'
|
||||
)
|
||||
|
||||
console.log(
|
||||
"\n 🤑 Initial balance of receiver wallet on network => ",
|
||||
initialBalanceOfReceiver.toString(),
|
||||
'\n'
|
||||
)
|
||||
|
||||
// Get the core Tornado Cash logic.
|
||||
const core = new Tornado.Core()
|
||||
|
||||
// Get a regular ethers v5 provider.
|
||||
const provider = new providers.JsonRpcProvider("https://some.rpc.url")
|
||||
await core.connect(torProvider)
|
||||
|
||||
// This time we need to connect the provider
|
||||
await core.connect(provider)
|
||||
console.log("\n 🌪️ Tornado Core connected!\n")
|
||||
|
||||
// We also need a relayer
|
||||
const relayer = new Tornado.Web.Relayer({
|
||||
url: "https://" + "some.relayer.org",
|
||||
// Web can also instead provide a TorHttpClient or an (ethers v5) TorProvider
|
||||
httpClient: new Tornado.Web.RegularHttpClient()
|
||||
})
|
||||
const instance = core.getInstance("eth", 1)
|
||||
|
||||
// We always have to fetch the current properties of a relayer
|
||||
await relayer.fetchProperties()
|
||||
const note = (await core.loadNotes())[0]
|
||||
|
||||
// Once that is done let's get an instance we have a proof of
|
||||
const instance = core.getInstance("eth", "0.1")
|
||||
const proof = await core.createDepositProof(
|
||||
instance,
|
||||
{ address: receiverWallet.address },
|
||||
receiverWallet.address,
|
||||
note
|
||||
)
|
||||
|
||||
// We have to load the note, the arguments can be
|
||||
// indexes - indexes according to which you may choose the notes in cache
|
||||
// keys - the keys according to which you may choose the notes in cache
|
||||
// In our case we've set indexes to undefined and choosing our notes according to the instance
|
||||
// And then selecting the first one of those
|
||||
const note = (await core.loadNotes(undefined, {
|
||||
network: '' + core.chain.id,
|
||||
token: "eth",
|
||||
denomination: "0.1"
|
||||
}))[0]
|
||||
console.log(`\n 📜 Proof built:\n\n${proof}\n`)
|
||||
|
||||
// Now build the proof
|
||||
const proof = await core.createDepositProof(instance, relayer.properties, receiverAddress, note, {
|
||||
// Defaults after the function populates as a showcase
|
||||
// You can also leave all of this out and it will set it by itself
|
||||
checkNotesSpent: true,
|
||||
checkKnownRoot: true,
|
||||
merkleTreeHeight: 20,
|
||||
tokenDecimals: 18,
|
||||
ethPurchaseAmounts: [BigNumber.from(0)], // When doing multiple proofs, more elements in array
|
||||
gasPrice: undefined,
|
||||
gasPriceCushion: undefined,
|
||||
})
|
||||
const response = await instance.connect(receiverWallet).withdraw(proof[0], proof[1], proof[2], proof[3], proof[4], proof[5], proof[6])
|
||||
|
||||
console.log(proof)
|
||||
await response.wait()
|
||||
|
||||
console.log("\n 🌪️🌪️🌪️💰🥷 Withdrawal successful! \n")
|
||||
|
||||
console.log(
|
||||
"\n 🤑 Balance of the receiver wallet on network => ",
|
||||
(await receiverWallet.getBalance()).toString(),
|
||||
'\n'
|
||||
)
|
||||
}
|
||||
|
||||
main()
|
||||
@ -109,7 +159,7 @@ async function sync() {
|
||||
// Sync! Output will be in the project dir in the cache folder
|
||||
await core.syncDeposits(instance)
|
||||
|
||||
// Now export it as an archive!
|
||||
// Now export it as a zipped archive!
|
||||
await core.exportCacheZip('Deposits1ETH0.1')
|
||||
}
|
||||
|
||||
@ -145,7 +195,7 @@ async function sync() {
|
||||
}
|
||||
)
|
||||
|
||||
// Export as archive again!
|
||||
// Export as a zipped archive again!
|
||||
await core.exportCacheZip('Deposits1ETH0.1')
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user