Skip to content

Commit

Permalink
only check for strike collateral in off-chain
Browse files Browse the repository at this point in the history
  • Loading branch information
shan501 committed Dec 16, 2024
1 parent 1ffa63b commit 7530e5c
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 179 deletions.
6 changes: 0 additions & 6 deletions lib/constants.ak
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
use aiken/crypto.{ScriptHash, VerificationKeyHash}
use cardano/address.{Credential, Inline, StakeCredential, VerificationKey}
use cardano/assets.{AssetName, PolicyId}

// all random temp value
pub const burn_address: ScriptHash =
#"3d960f7ce468aa238665abd8327f2916926f33350b45b2b1dbac3c03"

pub const strike_policy_id: PolicyId =
#"d6ffbc9038719c18a1f993c2d2bd7cd4cf33209b3ad2f75342382365"

pub const strike_asset_name: AssetName = #"535452494b45"

pub const stake_key_credential: Credential =
VerificationKey(#"725011d2c296eb3341e159b6c5c6991de11e81062b95108c9aa024ad")

Expand Down
1 change: 0 additions & 1 deletion lib/types.ak
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ pub type ForwardsDatum {
obligee_deposit_asset_amount: Int,
collateral_asset: AssetClass,
each_party_collateral_asset_amount: Int,
each_party_strike_collateral_asset_amount: Int,
exercise_contract_date: POSIXTime,
mint_asset: AssetClass,
}
Expand Down
7 changes: 5 additions & 2 deletions validators/agreement.ak
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
use aiken/collection/list
use cardano/assets
use cardano/assets.{AssetName, PolicyId}
use cardano/transaction.{Transaction}
use types.{AgreementDatum, ForwardsDatum}
use utils.{get_lower_bound, get_validators_inputs}

validator agreement {
validator agreement(
_underlying_asset_policy_id: PolicyId,
_underlying_asset_name: AssetName,
) {
spend(
maybe_datum: Option<AgreementDatum>,
_redeemer: Int,
Expand Down
122 changes: 12 additions & 110 deletions validators/collateral.ak
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
use aiken/collection/list
use aiken/crypto.{ScriptHash}
use cardano/address.{Script, from_verification_key}
use cardano/address.{from_verification_key}
use cardano/assets.{Value, flatten, lovelace_of, match}
use cardano/transaction.{
InlineDatum, Output, OutputReference, Transaction, find_script_outputs,
}
use constants.{
burn_address, strike_asset_name, strike_consume_address_hash, strike_policy_id,
strike_stake_credential,
}
use constants.{strike_consume_address_hash, strike_stake_credential}
use types.{
AgreementDatum, AssetClass, BothSidesDepositAgreement, CollateralDatum,
CollateralRedeemerAction, ForwardsDatum, Issuer, LiquidateBothParties,
Expand Down Expand Up @@ -78,7 +75,6 @@ fn one_side_deposit_agreement_valid(
obligee_deposit_asset,
obligee_deposit_asset_amount,
each_party_collateral_asset_amount,
each_party_strike_collateral_asset_amount,
..
} = datum.associated_forwards_datum

Expand Down Expand Up @@ -134,31 +130,10 @@ fn one_side_deposit_agreement_valid(
let signed_transaction: Bool =
signed_by_party(transaction, deposit_party, datum)

let strike_is_used_as_collateral: Bool =
each_party_strike_collateral_asset_amount > 0

expect
only_one_validator_input && updated_datum_correct && deadline_not_passed && ref_script_empty && no_side_has_deposited_asset && signed_transaction && output_address_valid

if strike_is_used_as_collateral {
let expected_assets_locked_with_strike: Value =
expected_assets_locked
|> assets.add(
strike_policy_id,
strike_asset_name,
each_party_strike_collateral_asset_amount,
)
let assets_match =
match(output_to_validator.value, expected_assets_locked, >=)

let assets_match =
match(output_to_validator.value, expected_assets_locked_with_strike, >=)

assets_match
} else {
let assets_match =
match(output_to_validator.value, expected_assets_locked, >=)

assets_match
}
assets_match && only_one_validator_input && updated_datum_correct && deadline_not_passed && ref_script_empty && no_side_has_deposited_asset && signed_transaction && output_address_valid
}

fn both_sides_deposit_agreement_valid(
Expand Down Expand Up @@ -279,16 +254,12 @@ fn liquidate_collateral_valid(
transaction: Transaction,
liquidate_party: Party,
) {
let Transaction { mint, outputs, validity_range, .. } = transaction
let Transaction { mint, validity_range, .. } = transaction

expect Some(datum) = maybe_datum

let ForwardsDatum {
exercise_contract_date,
mint_asset,
each_party_strike_collateral_asset_amount,
..
} = datum.associated_forwards_datum
let ForwardsDatum { exercise_contract_date, mint_asset, .. } =
datum.associated_forwards_datum

let signed_transaction: Bool =
signed_by_party(transaction, liquidate_party, datum)
Expand All @@ -306,43 +277,7 @@ fn liquidate_collateral_valid(
let only_one_validator_input =
list.length(get_validators_inputs(transaction)) == 1

expect
deadline_has_passed && party_has_deposited_asset && valid_mint && signed_transaction && only_one_validator_input

let strike_is_used_as_collateral: Bool =
each_party_strike_collateral_asset_amount > 0

if strike_is_used_as_collateral {
expect Some(output_to_burn_address) =
list.find(
outputs,
fn(output) {
expect Script(output_to_liquidate_hash) =
output.address.payment_credential

output_to_liquidate_hash == burn_address
},
)

let expected_strike_collateral_asset_burnt: Value =
assets.from_lovelace(lovelace_of(output_to_burn_address.value))
|> assets.add(
strike_policy_id,
strike_asset_name,
each_party_strike_collateral_asset_amount,
)

let strike_collateral_asset_burnt: Bool =
match(
output_to_burn_address.value,
expected_strike_collateral_asset_burnt,
>=,
)

strike_collateral_asset_burnt
} else {
True
}
deadline_has_passed && party_has_deposited_asset && valid_mint && signed_transaction && only_one_validator_input
}

pub fn liquidate_both_parties_valid(
Expand All @@ -358,7 +293,7 @@ pub fn liquidate_both_parties_valid(
exercise_contract_date,
collateral_asset,
mint_asset,
each_party_strike_collateral_asset_amount,
each_party_collateral_asset_amount,
..
} = datum.associated_forwards_datum

Expand All @@ -380,7 +315,7 @@ pub fn liquidate_both_parties_valid(
|> assets.add(
collateral_asset.policy_id,
collateral_asset.asset_name,
each_party_strike_collateral_asset_amount * 2,
each_party_collateral_asset_amount * 2,
)

let collateral_assets_sent: Bool =
Expand All @@ -403,38 +338,5 @@ pub fn liquidate_both_parties_valid(
let only_one_validator_input: Bool =
list.length(get_validators_inputs(transaction)) == 1

expect
deadline_has_passed && collateral_assets_sent && both_party_has_not_deposited_asset && valid_mint && only_one_validator_input && output_is_to_strike_consume_address

if each_party_strike_collateral_asset_amount > 0 {
expect Some(output_to_burn_address) =
list.find(
outputs,
fn(output) {
expect Script(output_to_liquidate_hash) =
output.address.payment_credential

output_to_liquidate_hash == burn_address
},
)

let expected_strike_collateral_asset_burnt: Value =
assets.from_lovelace(lovelace_of(output_to_burn_address.value))
|> assets.add(
strike_policy_id,
strike_asset_name,
each_party_strike_collateral_asset_amount * 2,
)

let strike_collateral_asset_burnt: Bool =
match(
output_to_burn_address.value,
expected_strike_collateral_asset_burnt,
>=,
)

strike_collateral_asset_burnt
} else {
True
}
deadline_has_passed && collateral_assets_sent && both_party_has_not_deposited_asset && valid_mint && only_one_validator_input && output_is_to_strike_consume_address
}
69 changes: 9 additions & 60 deletions validators/forwards.ak
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use aiken/crypto.{ScriptHash, VerificationKeyHash}
use cardano/address.{Script}
use cardano/assets.{AssetName, PolicyId, Value, flatten, match}
use cardano/transaction.{InlineDatum, Output, Transaction}
use constants.{strike_asset_name, strike_policy_id, strike_stake_credential}
use constants.{strike_stake_credential}
use types.{
AcceptForwardsContract, CancelForwardsContract, CollateralDatum,
CreateForwardMint, EnterForwardMint, ForwardsDatum, ForwardsRedeemer,
Expand Down Expand Up @@ -68,7 +68,6 @@ fn accept_forwards_contract_valid(
let ForwardsDatum {
collateral_asset,
each_party_collateral_asset_amount,
each_party_strike_collateral_asset_amount,
exercise_contract_date,
mint_asset,
..
Expand Down Expand Up @@ -118,34 +117,10 @@ fn accept_forwards_contract_valid(

let ref_script_empty = output_to_collateral_utxo.reference_script == None

expect
only_one_validator_input && stake_credential_is_valid && deadline_not_passed && ref_script_empty && expected_collateral_datum_match && output_is_to_collateral_validator

let strike_is_used_as_collateral: Bool =
each_party_strike_collateral_asset_amount > 0

if strike_is_used_as_collateral {
let expected_asset_locked_with_strike: Value =
expected_assets_locked
|> assets.add(
strike_policy_id,
strike_asset_name,
each_party_strike_collateral_asset_amount * 2,
)

let assets_match: Bool =
match(
output_to_collateral_utxo.value,
expected_asset_locked_with_strike,
>=,
)
assets_match
} else {
let assets_match: Bool =
match(output_to_collateral_utxo.value, expected_assets_locked, >=)

assets_match
}
let assets_match: Bool =
match(output_to_collateral_utxo.value, expected_assets_locked, >=)

assets_match && only_one_validator_input && stake_credential_is_valid && deadline_not_passed && ref_script_empty && expected_collateral_datum_match && output_is_to_collateral_validator
}

// asset is burnt and signed by issuer
Expand Down Expand Up @@ -195,7 +170,6 @@ fn create_forward_mint_valid(
issuer_deposit_asset_amount,
obligee_deposit_asset_amount,
mint_asset,
each_party_strike_collateral_asset_amount,
..
} = output_datum_typed

Expand Down Expand Up @@ -237,35 +211,10 @@ fn create_forward_mint_valid(
let mint_asset_valid =
mint_asset.policy_id == policy_id && mint_asset.asset_name == asset_name

expect
valid_mint && output_is_to_forward_validator && stake_credential_is_valid && ref_script_empty && deadline_not_passed && issuer_and_obligee_asset_different && issuer_asset_positive && obligee_asset_positive && mint_asset_valid

let strike_is_used_as_collateral: Bool =
each_party_strike_collateral_asset_amount > 0

if strike_is_used_as_collateral {
let expected_assets_locked_with_strike: Value =
expected_assets_locked
|> assets.add(
strike_policy_id,
strike_asset_name,
output_datum_typed.each_party_strike_collateral_asset_amount,
)

let assets_match =
match(
output_to_forward_contract_value,
expected_assets_locked_with_strike,
>=,
)

assets_match
} else {
let assets_match =
match(output_to_forward_contract_value, expected_assets_locked, >=)

assets_match
}
let assets_match =
match(output_to_forward_contract_value, expected_assets_locked, >=)

assets_match && valid_mint && output_is_to_forward_validator && stake_credential_is_valid && ref_script_empty && deadline_not_passed && issuer_and_obligee_asset_different && issuer_asset_positive && obligee_asset_positive && mint_asset_valid
}

fn enter_forward_mint_valid(
Expand Down

0 comments on commit 7530e5c

Please sign in to comment.