Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
6bf6b91
futures draft
ridev6 Mar 4, 2024
4568f71
futures account functions
ridev6 Mar 4, 2024
a214679
remove testnet chain id
ridev6 Mar 4, 2024
4599103
futures calculator + fixes
ridev6 Mar 6, 2024
fbcdc34
Auto-merge 'main' -> 'wxdefi-502-futures'
github-actions[bot] Mar 6, 2024
5699f91
futures calculator test and fixes
ridev6 Mar 7, 2024
b169edb
validate order's matcher and assets
ridev6 Mar 12, 2024
9bf53b6
Auto-merge 'main' -> 'wxdefi-502-futures'
github-actions[bot] Mar 12, 2024
d51ce69
user's requests list + limit
ridev6 Mar 13, 2024
b725fc5
Merge remote-tracking branch 'origin/wxdefi-502-futures' into wxdefi-…
ridev6 Mar 13, 2024
1e2da6f
refactor
ridev6 Mar 13, 2024
f3e4ca8
mustFactory in calculator
ridev6 Mar 14, 2024
3369667
deposit, withdraw draft
ridev6 Mar 14, 2024
6a59947
comments
ridev6 Mar 14, 2024
5249f19
pairAllowance
ridev6 Mar 19, 2024
b0fee8e
todo
ridev6 Mar 19, 2024
5761b4a
futures multisig
ridev6 Mar 21, 2024
41e4d15
futures multisig in contracts
ridev6 Mar 21, 2024
4d1ad02
remove todo
ridev6 Mar 21, 2024
752b49f
shutdown
ridev6 Mar 22, 2024
3a23c38
fix shutdown
ridev6 Mar 25, 2024
0d7249c
fix shutdown and pairAllowance
ridev6 Mar 25, 2024
bd77556
setPairAllowance
ridev6 Mar 25, 2024
05c7097
multisig init test + fixes
ridev6 Mar 26, 2024
9034d09
multisig duplicates check and test
ridev6 Mar 26, 2024
8140fc4
addOwner test
ridev6 Mar 26, 2024
d95bc54
remove owner test + fixes
ridev6 Mar 27, 2024
e071523
set quorum test
ridev6 Mar 27, 2024
f8c0ce9
confirm transaction test
ridev6 Mar 27, 2024
64509d7
revoke confirmation test
ridev6 Mar 27, 2024
fbb102e
confirm transaction test fix
ridev6 Mar 27, 2024
2f09006
futures tests fix
ridev6 Mar 28, 2024
bdb256e
update multisig init test
ridev6 Mar 29, 2024
75dd968
set multisig test
ridev6 Mar 29, 2024
38ce151
futures factory permissions test
ridev6 Mar 29, 2024
cbf5b75
tests and fixes
ridev6 Apr 1, 2024
c26bf7b
account permissions tests and fix
ridev6 Apr 2, 2024
ef3a04e
WIP: shutdown test
ridev6 Apr 2, 2024
9abf195
borrow and repay templates
ridev6 Apr 3, 2024
c9c2804
shutdown tests and contracts fixes
ridev6 Apr 3, 2024
d1d8bef
fix tests
ridev6 Apr 3, 2024
f77304e
getCurrentPrice
ridev6 May 3, 2024
136183c
draft
ridev6 May 6, 2024
e8fd629
borrow draft
ridev6 May 8, 2024
7592e08
addSyntheticAsset
ridev6 May 8, 2024
861d495
wip: borrow
ridev6 May 8, 2024
dcc3a4b
Merge remote-tracking branch 'origin/main' into wxdefi-502-futures
ridev6 May 13, 2024
00e5c3d
x18 functions
ridev6 May 14, 2024
94a31ef
usdt in state, validate in deposit
ridev6 May 14, 2024
2092b3f
remove unused key
ridev6 May 14, 2024
418379b
requests by owner key fix
ridev6 May 14, 2024
2cd7239
bigint in formulas
ridev6 May 15, 2024
04dd480
fix formulas and borrow
ridev6 May 15, 2024
3d7f7ec
fix
ridev6 May 15, 2024
fbfec35
calcLiquidationPrice bigint
ridev6 May 15, 2024
7efbb56
remove completed todo
ridev6 May 15, 2024
9183c29
calc available credit for usdt and amount asset
ridev6 May 15, 2024
dfb44a1
validate owner in borrow
ridev6 May 16, 2024
2d62534
borrow: update credt and send synthetic asset
ridev6 May 16, 2024
93e01ea
fix borrow
ridev6 May 16, 2024
66fc54c
fix addSyntheticAsset
ridev6 May 16, 2024
511dbfa
check if account is ready in deposit
ridev6 May 16, 2024
2b6164a
leverage
ridev6 Jun 3, 2024
e0201a8
Account info read only
bra1nsurfer Jul 8, 2024
700203e
getUserInfoREADONLY
bra1nsurfer Jul 8, 2024
27f9ec0
getInfo
bra1nsurfer Jul 9, 2024
e632699
Added pair setting
bra1nsurfer Jul 29, 2024
fef32a2
Auto-merge 'main' -> 'wxdefi-502-futures'
github-actions[bot] Jul 29, 2024
b7c8b11
Fix getAccountInfoREADONLY
bra1nsurfer Jul 31, 2024
cb37420
Merge branch 'wxdefi-502-futures' of other.github.com:waves-exchange/…
bra1nsurfer Jul 31, 2024
159ba11
deposit, borrow refactoring
bra1nsurfer Aug 5, 2024
c8457c3
Added multisig safety
bra1nsurfer Aug 9, 2024
3013170
Fixed mustAdmin() exception
bra1nsurfer Aug 9, 2024
ba3d7bd
Merge branch 'main' of other.github.com:waves-exchange/contracts into…
bra1nsurfer Aug 21, 2024
ec848ec
Immediate proxy account match
bra1nsurfer Aug 26, 2024
df3fc35
Removed accountsQueue
bra1nsurfer Sep 2, 2024
9542aaa
Changed requestId generation
bra1nsurfer Sep 11, 2024
7df2f1e
Tests fixes
bra1nsurfer Sep 11, 2024
9ca26a8
Added editAccount function
bra1nsurfer Sep 17, 2024
80b9047
Auto-merge 'main' -> 'wxdefi-502-futures'
github-actions[bot] Sep 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
183 changes: 183 additions & 0 deletions ride/futures_account.ride
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
{-# STDLIB_VERSION 7 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}

let separator = "__"
let chainId = this.bytes.drop(1).take(1)
let chainIdW = base16'57'
let contractFilename = "futures_account.ride"

let kMultisig = "%s__multisig"
func kStatus(dapp: String, txId: String) = ["%s__status", dapp, txId].makeString(separator)

let kShutdown = "%s__shutdown"

func wrapErr(s: String) = {
contractFilename + ": " + s
}

func throwErr(s: String) = {
throw(wrapErr(s))
}

func mustAddress(i: Invocation, address: Address) = {
i.caller == address || throwErr("permission denied")
}

func mustThis(i: Invocation) = {
mustAddress(i, this)
}

let wavesString = "WAVES"

func parseAssetId(input: String) = {
if (input == wavesString) then unit else input.fromBase58String()
}

func assetIdToString(input: ByteVector|Unit) = {
if (input == unit) then wavesString else input.value().toBase58String()
}

let kFactoryPublicKey = "%s__factoryPublicKey"

func kAccountAddressToRequestId(accountAddress: Address) = {
["%s%s", accountAddress.toString(), "accountAddressToRequestId"].makeString(separator)
}
func kAccountOwner(requestId: String) = {
["%s%s", requestId, "ownerPublicKey"].makeString(separator)
}
func kRequestAmountAssetId(requestId: String) = {
["%s%s", requestId, "amountAssetId"].makeString(separator)
}
func kRequestPriceAssetId(requestId: String) = {
["%s%s", requestId, "priceAssetId"].makeString(separator)
}

let factoryAddress = addressFromPublicKey(
this.getBinary(kFactoryPublicKey).valueOrErrorMessage(
wrapErr("factory public key is not defined")
)
)

let shutdown = factoryAddress.getBoolean(kShutdown).valueOrElse(false)

let kCalculatorAddress = "%s__calculatorAddress"
let calculatorAddressOption = match factoryAddress.getString(kCalculatorAddress) {
case s: String => s.addressFromString()
case _: Unit => unit
}
let calculatorAddress = calculatorAddressOption.valueOrErrorMessage(wrapErr("invalid calculator address"))

let kMatcherPublicKey = "%s__matcherPublicKey"
let matcherPublicKeyOption = match factoryAddress.getString(kMatcherPublicKey) {
case s: String => s.fromBase58String()
case _: Unit => unit
}
let matcherPublicKey = matcherPublicKeyOption.valueOrErrorMessage(wrapErr("invalid matcher public key"))

let requestId = factoryAddress.getStringValue(kAccountAddressToRequestId(this))
let ownerPublicKey = factoryAddress.getBinaryValue(kAccountOwner(requestId))
let ownerAddress = addressFromPublicKey(ownerPublicKey)
let amountAssetId = factoryAddress.getStringValue(kRequestAmountAssetId(requestId)).parseAssetId()
let priceAssetId = factoryAddress.getStringValue(kRequestPriceAssetId(requestId)).parseAssetId()

func mustFactory(i: Invocation) = {
mustAddress(i, factoryAddress)
}

func mustCalculator(i: Invocation) = {
mustAddress(i, calculatorAddress)
}

func mustOwner(i: Invocation) = {
mustAddress(i, ownerAddress)
}

@Callable(i)
func stringEntry(key: String, val: String) =
if (!shutdown && i.mustCalculator()) then ([StringEntry(key, val)], key) else throwErr("not allowed")

@Callable(i)
func integerEntry(key: String, val: Int) =
if (!shutdown && i.mustCalculator()) then ([IntegerEntry(key, val)], key) else throwErr("not allowed")

@Callable(i)
func booleanEntry(key: String, val: Boolean) =
if (!shutdown && i.mustCalculator()) then ([BooleanEntry(key, val)], key) else throwErr("not allowed")

@Callable(i)
func binaryEntry(key: String, val: ByteVector) =
if (!shutdown && i.mustCalculator()) then ([BinaryEntry(key, val)], key) else throwErr("not allowed")

@Callable(i)
func deleteEntry(key: String) =
if (!shutdown && i.mustCalculator()) then ([DeleteEntry(key)], key) else throwErr("not allowed")

@Callable(i)
func reissue(assetId: ByteVector, amount: Int, reissuable: Boolean) =
if (!shutdown && i.mustCalculator()) then ([Reissue(assetId, amount, reissuable)], amount) else throwErr("not allowed")

@Callable(i)
func burn(assetId: ByteVector, amount: Int) =
if (!shutdown && i.mustCalculator()) then ([Burn(assetId, amount)], amount) else throwErr("not allowed")

@Callable(i)
func transferAsset(recipientBytes: ByteVector, amount: Int, assetId: ByteVector) =
if (!shutdown && i.mustCalculator()) then ([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount) else throwErr("not allowed")

@Callable(i)
func transferWaves(recipientBytes: ByteVector, amount: Int) =
if (!shutdown && i.mustCalculator()) then ([ScriptTransfer(Address(recipientBytes), amount, unit)], amount) else throwErr("not allowed")

@Callable(i)
func init(factoryPublicKey: ByteVector, creatorPublicKey: ByteVector) = {
strict checkCaller = i.mustThis()

# throws if accounts is not ok
strict completeRequest = addressFromPublicKey(
factoryPublicKey
).invoke("call", ["addAccount", [creatorPublicKey.toBase58String()]], [])

([
BinaryEntry(kFactoryPublicKey, factoryPublicKey)
], unit)
}

@Verifier(tx)
func verify() = {
let factoryPublicKeyOption = this.getBinary(kFactoryPublicKey)
match tx {
case o: Order => {
strict checks = [
!shutdown || throwErr("not allowed"),
o.matcherPublicKey == matcherPublicKey || throwErr(
"matcher public key must be " + matcherPublicKey.toBase58String()
),
o.assetPair.amountAsset == amountAssetId || throwErr(
"amount asset id have must be " + amountAssetId.assetIdToString()
),
o.assetPair.priceAsset == priceAssetId || throwErr(
"price asset id have must be" + priceAssetId.assetIdToString()
),
sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey) || throwErr(
"tx have must be signed by account owner " + ownerPublicKey.toBase58String()
)
]

true
}
case _ => if (factoryPublicKeyOption.isDefined()) then {
match factoryAddress.getString(kMultisig) {
case multisig: String => {
let statusKey = kStatus(this.toString(), tx.id.toBase58String())
let status = multisig.addressFromStringValue().getBoolean(statusKey).valueOrElse(false)

status
}
case _ => false
}
} else {
sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}
}
}
Loading