nim-codex/tests/contracts/testMarket.nim

102 lines
3.6 KiB
Nim
Raw Normal View History

import pkg/chronos
2022-05-19 19:56:03 +00:00
import codex/contracts
import codex/contracts/testtoken
import ../ethertest
import ./examples
import ./time
ethersuite "On-Chain Market":
let proof = seq[byte].example
var market: OnChainMarket
var storage: Storage
var token: TestToken
2022-03-29 07:47:49 +00:00
var request: StorageRequest
var offer: StorageOffer
setup:
let deployment = deployment()
storage = Storage.new(!deployment.address(Storage), provider.getSigner())
token = TestToken.new(!deployment.address(TestToken), provider.getSigner())
await token.mint(accounts[0], 1000.u256)
2022-03-29 07:47:49 +00:00
let collateral = await storage.collateralAmount()
await token.approve(storage.address, collateral)
await storage.deposit(collateral)
market = OnChainMarket.new(storage)
2022-03-29 07:47:49 +00:00
request = StorageRequest.example
offer = StorageOffer.example
request.client = accounts[0]
offer.host = accounts[0]
offer.requestId = request.id
offer.price = request.ask.maxPrice
2022-03-29 07:47:49 +00:00
test "fails to instantiate when contract does not have a signer":
let storageWithoutSigner = storage.connect(provider)
expect AssertionError:
discard OnChainMarket.new(storageWithoutSigner)
test "supports storage requests":
await token.approve(storage.address, request.ask.maxPrice)
check (await market.requestStorage(request)) == request
2022-03-29 07:47:49 +00:00
test "sets client address when submitting storage request":
var requestWithoutClient = request
requestWithoutClient.client = Address.default
await token.approve(storage.address, request.ask.maxPrice)
let submitted = await market.requestStorage(requestWithoutClient)
check submitted.client == accounts[0]
2022-03-29 07:47:49 +00:00
test "supports request subscriptions":
var receivedIds: seq[array[32, byte]]
var receivedAsks: seq[StorageAsk]
proc onRequest(id: array[32, byte], ask: StorageAsk) =
receivedIds.add(id)
receivedAsks.add(ask)
2022-03-29 07:47:49 +00:00
let subscription = await market.subscribeRequests(onRequest)
await token.approve(storage.address, request.ask.maxPrice)
discard await market.requestStorage(request)
check receivedIds == @[request.id]
check receivedAsks == @[request.ask]
await subscription.unsubscribe()
2022-03-29 07:47:49 +00:00
test "supports fulfilling of requests":
await token.approve(storage.address, request.ask.maxPrice)
discard await market.requestStorage(request)
await market.fulfillRequest(request.id, proof)
2022-03-29 07:47:49 +00:00
test "support fulfillment subscriptions":
await token.approve(storage.address, request.ask.maxPrice)
discard await market.requestStorage(request)
var receivedIds: seq[array[32, byte]]
proc onFulfillment(id: array[32, byte]) =
receivedIds.add(id)
let subscription = await market.subscribeFulfillment(request.id, onFulfillment)
await market.fulfillRequest(request.id, proof)
check receivedIds == @[request.id]
2022-03-29 09:20:07 +00:00
await subscription.unsubscribe()
test "subscribes only to fulfillmentof a certain request":
2022-03-29 09:20:07 +00:00
var otherRequest = StorageRequest.example
otherRequest.client = accounts[0]
await token.approve(storage.address, request.ask.maxPrice)
discard await market.requestStorage(request)
await token.approve(storage.address, otherrequest.ask.maxPrice)
discard await market.requestStorage(otherRequest)
2022-03-29 09:20:07 +00:00
var receivedIds: seq[array[32, byte]]
proc onFulfillment(id: array[32, byte]) =
receivedIds.add(id)
2022-03-29 09:20:07 +00:00
let subscription = await market.subscribeFulfillment(request.id, onFulfillment)
2022-03-29 09:20:07 +00:00
await market.fulfillRequest(request.id, proof)
await market.fulfillRequest(otherRequest.id, proof)
2022-03-29 09:20:07 +00:00
check receivedIds == @[request.id]
2022-03-29 09:20:07 +00:00
await subscription.unsubscribe()