Create Triple
[Problem Internal Link] are higher-order structures in the Intuition system, used to define relationships between Atoms. Each Triple consists of three components - Subject, Predicate, and Object - all represented as Atoms, enabling precise, machine-readable representations of data relationships.
Context
The createTriple
and batchCreateTriple
functions are part of the [Problem Internal Link] contract, which manages the creation and relationships between Atoms through Semantic Triples. When creating Triples, each component must reference existing Atom vault IDs. The Triple structure enables:
- Many-to-one attestations
- Positive and negative signaling through triple vaults
- Flat data structures for optimal scalability
For example, a Triple might represent:
- Subject: "Bob" (Atom ID: "1")
- Predicate: "is" (Atom ID: "2")
- Object: "Trustworthy" (Atom ID: "3")
createTriple
function createTriple(
uint256 subjectId,
uint256 predicateId,
uint256 objectId
) external payable nonReentrant whenNotPaused returns (uint256)
Parameters
subjectId
: vault ID of the Atom representing the subjectpredicateId
: vault ID of the Atom representing the predicate/relationshipobjectId
: vault ID of the Atom representing the objectvalue
: Initial deposit into the Triple’s positive multivault. Must be ≥ to the triple creation cost.- Returns:
uint256
- Created triple vault ID
Implementation
// useCreateTriple Hook
import { type GetContractReturnType } from 'viem'
import { base } from 'viem/chains'
import { useContractWriteAndWait } from './useContractWriteAndWait'
import { useMultivaultContract } from './useMultivaultContract'
export const useCreateTriple = () => {
const multivault = useMultivaultContract(
base.id
) as GetContractReturnType
return useContractWriteAndWait({
...multivault,
functionName: 'createTriple',
})
}
// Usage Example
const {
writeAsync: writeCreateTriple,
awaitingWalletConfirmation,
awaitingOnChainConfirmation,
} = useCreateTriple()
async function handleCreateTriple(subjectId: string, predicateId: string, objectId: string) {
if (!awaitingOnChainConfirmation && !awaitingWalletConfirmation && writeCreateTriple) {
try {
const tx = await writeCreateTriple({
address: MULTIVAULT_CONTRACT_ADDRESS,
abi: multivaultAbi,
functionName: 'createTriple',
args: [BigInt(subjectId), BigInt(predicateId), BigInt(objectId)],
value: tripleCost, // Must be >= minimum creation cost
})
if (tx?.hash) {
const receipt = await publicClient.waitForTransactionReceipt({
hash: tx.hash,
})
// Handle success
}
} catch (error) {
// Handle error
}
}
}
createBatchTriple
function createTripleBatch(
uint256[] calldata subjectIds,
uint256[] calldata predicateIds,
uint256[] calldata objectIds
) external payable nonReentrant whenNotPaused returns (uint256[] memory)
Parameters
subjectIds
: vault ID(s) of the Atom representing the subjectspredicateIds
: vault ID(s) of the Atom representing the predicate/relationshipsobjectIds
: vault ID(s) of the Atom representing the objectsvalue
: Initial deposit into the triples’ multivaults. Must be ≥ to the atom creation cost * length of triples. This will get distributed evenly across all created triples.- Returns
uint256[]
- Created triples’ vault ID(s)
Implementation
// useBatchCreateTriple Hook
import { type GetContractReturnType } from 'viem'
import { base } from 'viem/chains'
import { useContractWriteAndWait } from './useContractWriteAndWait'
import { useMultivaultContract } from './useMultivaultContract'
export const useBatchCreateTriple = () => {
const multivault = useMultivaultContract(
base.id
) as GetContractReturnType
return useContractWriteAndWait({
...multivault,
functionName: 'createTripleBatch',
})
}
// Usage Example
const {
writeAsync: writeBatchCreateTriple,
awaitingWalletConfirmation,
awaitingOnChainConfirmation,
} = useBatchCreateTriple()
async function handleBatchCreateTriple(
subjectIds: string[],
predicateIds: string[],
objectIds: string[]
) {
const value = BigInt(tripleValue) * BigInt(subjectIds.length)
if (!awaitingOnChainConfirmation && !awaitingWalletConfirmation && writeBatchCreateTriple) {
try {
const tx = await writeBatchCreateTriple({
address: MULTIVAULT_CONTRACT_ADDRESS,
abi: multivaultAbi,
functionName: 'createTripleBatch',
args: [
subjectIds.map(BigInt),
predicateIds.map(BigInt),
objectIds.map(BigInt),
],
value: tripleCost * subjectIds.length, // Must be >= minimum creation cost * number of triples
})
if (tx?.hash) {
const receipt = await publicClient.waitForTransactionReceipt({
hash: tx.hash,
})
// Handle success
}
} catch (error) {
// Handle error
}
}
}
Cost Considerations
- Creation Cost:
- Minimum ETH required to create a Triple
- Retrieved via
getTripleCost()
- Includes protocol fee sent to treasury
- Must be included in transaction's
value
parameter
- Initial Deposit:
- Any ETH sent above the creation cost
- Deposited into the positive vault
- Subject to entry fees
See also:
- [Problem Internal Link]
- [Problem Internal Link]