Remove optional payoutAddress

Change --payout-address so that it is no longer optional. There is no longer an overload in `Marketplace.sol` for `fillSlot` accepting no `payoutAddress`.
This commit is contained in:
Eric 2024-08-12 16:43:31 +10:00
parent a668bca480
commit f9384d508a
No known key found for this signature in database
6 changed files with 36 additions and 49 deletions

View File

@ -295,10 +295,8 @@ type
payoutAddress* {. payoutAddress* {.
desc: "Address to send reward payouts to" desc: "Address to send reward payouts to"
defaultValue: EthAddress.none
defaultValueDesc: "Rewards will be sent to the SP's address (derived from --eth-private-key)"
name: "payout-address" name: "payout-address"
.}: Option[EthAddress] .}: EthAddress
case persistenceCmd* {. case persistenceCmd* {.
defaultValue: noCmd defaultValue: noCmd

View File

@ -19,7 +19,7 @@ type
OnChainMarket* = ref object of Market OnChainMarket* = ref object of Market
contract: Marketplace contract: Marketplace
signer: Signer signer: Signer
payoutAddress: ?Address payoutAddress: Address
MarketSubscription = market.Subscription MarketSubscription = market.Subscription
EventSubscription = ethers.Subscription EventSubscription = ethers.Subscription
OnChainMarketSubscription = ref object of MarketSubscription OnChainMarketSubscription = ref object of MarketSubscription
@ -28,7 +28,7 @@ type
func new*( func new*(
_: type OnChainMarket, _: type OnChainMarket,
contract: Marketplace, contract: Marketplace,
payoutAddress = Address.none): OnChainMarket = payoutAddress: Address): OnChainMarket =
without signer =? contract.signer: without signer =? contract.signer:
raiseAssert("Marketplace contract should have a signer") raiseAssert("Marketplace contract should have a signer")
@ -167,12 +167,9 @@ method fillSlot(market: OnChainMarket,
convertEthersError: convertEthersError:
await market.approveFunds(collateral) await market.approveFunds(collateral)
var fillSlot: Future[?TransactionResponse] discard await market.contract.fillSlot(
if payoutAddress =? market.payoutAddress: requestId, slotIndex, proof, market.payoutAddress
fillSlot = market.contract.fillSlot(requestId, slotIndex, proof, payoutAddress) ).confirm(0)
else:
fillSlot = market.contract.fillSlot(requestId, slotIndex, proof)
discard await fillSlot.confirm(0)
method freeSlot*(market: OnChainMarket, slotId: SlotId) {.async.} = method freeSlot*(market: OnChainMarket, slotId: SlotId) {.async.} =
convertEthersError: convertEthersError:

View File

@ -43,7 +43,6 @@ proc slashPercentage*(marketplace: Marketplace): UInt256 {.contract, view.}
proc minCollateralThreshold*(marketplace: Marketplace): UInt256 {.contract, view.} proc minCollateralThreshold*(marketplace: Marketplace): UInt256 {.contract, view.}
proc requestStorage*(marketplace: Marketplace, request: StorageRequest): ?TransactionResponse {.contract.} proc requestStorage*(marketplace: Marketplace, request: StorageRequest): ?TransactionResponse {.contract.}
proc fillSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256, proof: Groth16Proof): ?TransactionResponse {.contract.}
proc fillSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256, proof: Groth16Proof, payoutAddress: Address): ?TransactionResponse {.contract.} proc fillSlot*(marketplace: Marketplace, requestId: RequestId, slotIndex: UInt256, proof: Groth16Proof, payoutAddress: Address): ?TransactionResponse {.contract.}
proc withdrawFunds*(marketplace: Marketplace, requestId: RequestId): ?TransactionResponse {.contract.} proc withdrawFunds*(marketplace: Marketplace, requestId: RequestId): ?TransactionResponse {.contract.}
proc freeSlot*(marketplace: Marketplace, id: SlotId): ?TransactionResponse {.contract.} proc freeSlot*(marketplace: Marketplace, id: SlotId): ?TransactionResponse {.contract.}

View File

@ -11,6 +11,7 @@ ethersuite "Marketplace contracts":
let proof = Groth16Proof.example let proof = Groth16Proof.example
var client, host: Signer var client, host: Signer
var payoutAddress: Address
var marketplace: Marketplace var marketplace: Marketplace
var token: Erc20Token var token: Erc20Token
var periodicity: Periodicity var periodicity: Periodicity
@ -24,6 +25,7 @@ ethersuite "Marketplace contracts":
setup: setup:
client = ethProvider.getSigner(accounts[0]) client = ethProvider.getSigner(accounts[0])
host = ethProvider.getSigner(accounts[1]) host = ethProvider.getSigner(accounts[1])
payoutAddress = accounts[2]
let address = Marketplace.address(dummyVerifier = true) let address = Marketplace.address(dummyVerifier = true)
marketplace = Marketplace.new(address, ethProvider.getSigner()) marketplace = Marketplace.new(address, ethProvider.getSigner())
@ -42,7 +44,7 @@ ethersuite "Marketplace contracts":
discard await marketplace.requestStorage(request) discard await marketplace.requestStorage(request)
switchAccount(host) switchAccount(host)
discard await token.approve(marketplace.address, request.ask.collateral) discard await token.approve(marketplace.address, request.ask.collateral)
discard await marketplace.fillSlot(request.id, 0.u256, proof) discard await marketplace.fillSlot(request.id, 0.u256, proof, payoutAddress)
slotId = request.slotId(0.u256) slotId = request.slotId(0.u256)
proc waitUntilProofRequired(slotId: SlotId) {.async.} = proc waitUntilProofRequired(slotId: SlotId) {.async.} =
@ -57,7 +59,7 @@ ethersuite "Marketplace contracts":
proc startContract() {.async.} = proc startContract() {.async.} =
for slotIndex in 1..<request.ask.slots: for slotIndex in 1..<request.ask.slots:
discard await token.approve(marketplace.address, request.ask.collateral) discard await token.approve(marketplace.address, request.ask.collateral)
discard await marketplace.fillSlot(request.id, slotIndex.u256, proof) discard await marketplace.fillSlot(request.id, slotIndex.u256, proof, payoutAddress)
test "accept marketplace proofs": test "accept marketplace proofs":
switchAccount(host) switchAccount(host)
@ -75,14 +77,18 @@ ethersuite "Marketplace contracts":
test "can be paid out at the end": test "can be paid out at the end":
switchAccount(host) switchAccount(host)
let address = await host.getAddress() let hostAddress = await host.getAddress()
await startContract() await startContract()
let requestEnd = await marketplace.requestEnd(request.id) let requestEnd = await marketplace.requestEnd(request.id)
await ethProvider.advanceTimeTo(requestEnd.u256 + 1) await ethProvider.advanceTimeTo(requestEnd.u256 + 1)
let startBalance = await token.balanceOf(address) let startBalanceHost = await token.balanceOf(hostAddress)
let startBalancePayout = await token.balanceOf(payoutAddress)
discard await marketplace.freeSlot(slotId) discard await marketplace.freeSlot(slotId)
let endBalance = await token.balanceOf(address) let endBalanceHost = await token.balanceOf(hostAddress)
check endBalance == (startBalance + request.ask.duration * request.ask.reward + request.ask.collateral) let endBalancePayout = await token.balanceOf(payoutAddress)
check endBalanceHost == (startBalanceHost + request.ask.collateral)
check endBalancePayout == (startBalancePayout + request.ask.duration * request.ask.reward)
test "cannot mark proofs missing for cancelled request": test "cannot mark proofs missing for cancelled request":
let expiry = await marketplace.requestExpiry(request.id) let expiry = await marketplace.requestExpiry(request.id)

View File

@ -17,13 +17,20 @@ ethersuite "On-Chain Market":
var slotIndex: UInt256 var slotIndex: UInt256
var periodicity: Periodicity var periodicity: Periodicity
var host: Signer var host: Signer
var payoutAddress: Address
proc switchAccount(account: Signer) =
marketplace = marketplace.connect(account)
token = token.connect(account)
market = OnChainMarket.new(marketplace, payoutAddress)
setup: setup:
let address = Marketplace.address(dummyVerifier = true) let address = Marketplace.address(dummyVerifier = true)
marketplace = Marketplace.new(address, ethProvider.getSigner()) marketplace = Marketplace.new(address, ethProvider.getSigner())
let config = await marketplace.config() let config = await marketplace.config()
payoutAddress = accounts[2]
market = OnChainMarket.new(marketplace) market = OnChainMarket.new(marketplace, payoutAddress)
let tokenAddress = await marketplace.token() let tokenAddress = await marketplace.token()
token = Erc20Token.new(tokenAddress, ethProvider.getSigner()) token = Erc20Token.new(tokenAddress, ethProvider.getSigner())
@ -31,6 +38,7 @@ ethersuite "On-Chain Market":
request = StorageRequest.example request = StorageRequest.example
request.client = accounts[0] request.client = accounts[0]
host = ethProvider.getSigner(accounts[1])
slotIndex = (request.ask.slots div 2).u256 slotIndex = (request.ask.slots div 2).u256
@ -53,7 +61,7 @@ ethersuite "On-Chain Market":
test "fails to instantiate when contract does not have a signer": test "fails to instantiate when contract does not have a signer":
let storageWithoutSigner = marketplace.connect(ethProvider) let storageWithoutSigner = marketplace.connect(ethProvider)
expect AssertionDefect: expect AssertionDefect:
discard OnChainMarket.new(storageWithoutSigner) discard OnChainMarket.new(storageWithoutSigner, payoutAddress)
test "knows signer address": test "knows signer address":
check (await market.getSigner()) == (await ethProvider.getSigner().getAddress()) check (await market.getSigner()) == (await ethProvider.getSigner().getAddress())
@ -360,32 +368,12 @@ ethersuite "On-Chain Market":
(await market.queryPastStorageRequests(blocksAgo = 2)) (await market.queryPastStorageRequests(blocksAgo = 2))
) )
test "pays out to host address, including collateral":
let address = request.client
await market.requestStorage(request)
for slotIndex in 0..<request.ask.slots:
await market.fillSlot(request.id, slotIndex.u256, proof, request.ask.collateral)
let requestEnd = await market.getRequestEnd(request.id)
await ethProvider.advanceTimeTo(requestEnd.u256 + 1)
let startBalance = await token.balanceOf(address)
await market.freeSlot(request.slotId(0.u256))
let endBalance = await token.balanceOf(address)
check endBalance == (startBalance +
request.ask.duration * request.ask.reward +
request.ask.collateral)
test "pays out to payout address, collateral paid to host address": test "pays out to payout address, collateral paid to host address":
let hostAddress = request.client let hostAddress = await host.getAddress()
let hostPayoutAddress = accounts[2]
market = OnChainMarket.new(marketplace, hostPayoutAddress.some)
await market.requestStorage(request) await market.requestStorage(request)
switchAccount(host)
for slotIndex in 0..<request.ask.slots: for slotIndex in 0..<request.ask.slots:
await market.fillSlot(request.id, slotIndex.u256, proof, request.ask.collateral) await market.fillSlot(request.id, slotIndex.u256, proof, request.ask.collateral)
@ -393,14 +381,13 @@ ethersuite "On-Chain Market":
await ethProvider.advanceTimeTo(requestEnd.u256 + 1) await ethProvider.advanceTimeTo(requestEnd.u256 + 1)
let startBalanceHost = await token.balanceOf(hostAddress) let startBalanceHost = await token.balanceOf(hostAddress)
let startBalanceHostPayout = await token.balanceOf(hostPayoutAddress) let startBalancePayout = await token.balanceOf(payoutAddress)
await market.freeSlot(request.slotId(0.u256)) await market.freeSlot(request.slotId(0.u256))
let endBalanceHost = await token.balanceOf(hostAddress) let endBalanceHost = await token.balanceOf(hostAddress)
let endBalanceHostPayout = await token.balanceOf(hostPayoutAddress) let endBalancePayout = await token.balanceOf(payoutAddress)
check endBalanceHostPayout == (startBalanceHostPayout + check endBalanceHost == (startBalanceHost + request.ask.collateral)
request.ask.duration * request.ask.reward) check endBalancePayout == (startBalancePayout +
check endBalanceHost == (startBalanceHost + request.ask.duration * request.ask.reward)
request.ask.collateral)

@ -1 +1 @@
Subproject commit be76f4042aafad65c8a303382fa302f8d775b10b Subproject commit 6db5479c855ff9048c6557aa7966a40d308492b4