update reward and withdraw functions
This commit is contained in:
parent
9581d0e72d
commit
c00c62cb5f
@ -97,8 +97,31 @@ class Controller {
|
|||||||
return { proofs, args }
|
return { proofs, args }
|
||||||
}
|
}
|
||||||
|
|
||||||
async reward({ account, note, publicKey, fee = 0, relayer = 0, accountCommitments = null }) {
|
/**
|
||||||
const rate = await this.contract.methods.rates(note.instance).call()
|
* Generates proof and args to claim AP (anonymity points) for a note
|
||||||
|
* @param {Account} account The account the AP will be added to
|
||||||
|
* @param {Note} note The target note
|
||||||
|
* @param {String} publicKey ETH public key for the Account encryption
|
||||||
|
* @param {Number} fee Fee for the relayer
|
||||||
|
* @param {String} relayer Relayer address
|
||||||
|
* @param {Number} rate How many AP is generated for the note in block time
|
||||||
|
* @param {String[]} accountCommitments An array of account commitments from miner contract
|
||||||
|
* @param {String[]} depositDataEvents An array of account commitments from miner contract
|
||||||
|
* @param {{instance: String, hash: String, block: Number, index: Number}[]} depositDataEvents An array of deposit objects from tornadoTrees contract. hash = commitment
|
||||||
|
* @param {{instance: String, hash: String, block: Number, index: Number}[]} withdrawalDataEvents An array of withdrawal objects from tornadoTrees contract. hash = nullifierHash
|
||||||
|
*/
|
||||||
|
async reward({
|
||||||
|
account,
|
||||||
|
note,
|
||||||
|
publicKey,
|
||||||
|
fee = 0,
|
||||||
|
relayer = 0,
|
||||||
|
rate = null,
|
||||||
|
accountCommitments = null,
|
||||||
|
depositDataEvents = null,
|
||||||
|
withdrawalDataEvents = null,
|
||||||
|
}) {
|
||||||
|
rate = rate || (await this.contract.methods.rates(note.instance).call())
|
||||||
|
|
||||||
const newAmount = account.amount.add(
|
const newAmount = account.amount.add(
|
||||||
toBN(rate)
|
toBN(rate)
|
||||||
@ -107,7 +130,7 @@ class Controller {
|
|||||||
)
|
)
|
||||||
const newAccount = new Account({ amount: newAmount })
|
const newAccount = new Account({ amount: newAmount })
|
||||||
|
|
||||||
const depositDataEvents = await this._fetchDepositDataEvents()
|
depositDataEvents = depositDataEvents || (await this._fetchDepositDataEvents())
|
||||||
const depositLeaves = depositDataEvents.map((x) => poseidonHash([x.instance, x.hash, x.block]))
|
const depositLeaves = depositDataEvents.map((x) => poseidonHash([x.instance, x.hash, x.block]))
|
||||||
const depositTree = new MerkleTree(this.merkleTreeHeight, depositLeaves, { hashFunction: poseidonHash2 })
|
const depositTree = new MerkleTree(this.merkleTreeHeight, depositLeaves, { hashFunction: poseidonHash2 })
|
||||||
const depositItem = depositDataEvents.filter((x) => x.hash === toFixedHex(note.commitment))
|
const depositItem = depositDataEvents.filter((x) => x.hash === toFixedHex(note.commitment))
|
||||||
@ -116,7 +139,7 @@ class Controller {
|
|||||||
}
|
}
|
||||||
const depositPath = depositTree.path(depositItem[0].index)
|
const depositPath = depositTree.path(depositItem[0].index)
|
||||||
|
|
||||||
const withdrawalDataEvents = await this._fetchWithdrawalDataEvents()
|
withdrawalDataEvents = withdrawalDataEvents || (await this._fetchWithdrawalDataEvents())
|
||||||
const withdrawalLeaves = withdrawalDataEvents.map((x) => poseidonHash([x.instance, x.hash, x.block]))
|
const withdrawalLeaves = withdrawalDataEvents.map((x) => poseidonHash([x.instance, x.hash, x.block]))
|
||||||
const withdrawalTree = new MerkleTree(this.merkleTreeHeight, withdrawalLeaves, {
|
const withdrawalTree = new MerkleTree(this.merkleTreeHeight, withdrawalLeaves, {
|
||||||
hashFunction: poseidonHash2,
|
hashFunction: poseidonHash2,
|
||||||
@ -135,7 +158,7 @@ class Controller {
|
|||||||
pathElements: new Array(this.merkleTreeHeight).fill(0),
|
pathElements: new Array(this.merkleTreeHeight).fill(0),
|
||||||
pathIndices: new Array(this.merkleTreeHeight).fill(0),
|
pathIndices: new Array(this.merkleTreeHeight).fill(0),
|
||||||
}
|
}
|
||||||
const accountIndex = accountTree.indexOf(account.commitment, (a, b) => a.eq(b))
|
const accountIndex = accountTree.indexOf(account.commitment, (a, b) => toBN(a).eq(toBN(b)))
|
||||||
const accountPath = accountIndex !== -1 ? accountTree.path(accountIndex) : zeroAccount
|
const accountPath = accountIndex !== -1 ? accountTree.path(accountIndex) : zeroAccount
|
||||||
const accountTreeUpdate = this._updateTree(accountTree, newAccount.commitment)
|
const accountTreeUpdate = this._updateTree(accountTree, newAccount.commitment)
|
||||||
|
|
||||||
@ -215,15 +238,15 @@ class Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async withdraw({ account, amount, recipient, publicKey, fee = 0, relayer = 0 }) {
|
async withdraw({ account, amount, recipient, publicKey, fee = 0, relayer = 0, accountCommitments = null }) {
|
||||||
const newAmount = account.amount.sub(toBN(amount)).sub(toBN(fee))
|
const newAmount = account.amount.sub(toBN(amount)).sub(toBN(fee))
|
||||||
const newAccount = new Account({ amount: newAmount })
|
const newAccount = new Account({ amount: newAmount })
|
||||||
|
|
||||||
const accountCommitments = await this._fetchAccountCommitments()
|
accountCommitments = accountCommitments || (await this._fetchAccountCommitments())
|
||||||
const accountTree = new MerkleTree(this.merkleTreeHeight, accountCommitments, {
|
const accountTree = new MerkleTree(this.merkleTreeHeight, accountCommitments, {
|
||||||
hashFunction: poseidonHash2,
|
hashFunction: poseidonHash2,
|
||||||
})
|
})
|
||||||
const accountIndex = accountTree.indexOf(account.commitment, (a, b) => a.eq(b))
|
const accountIndex = accountTree.indexOf(account.commitment, (a, b) => toBN(a).eq(toBN(b)))
|
||||||
if (accountIndex === -1) {
|
if (accountIndex === -1) {
|
||||||
throw new Error('The accounts tree does not contain such account commitment')
|
throw new Error('The accounts tree does not contain such account commitment')
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user