{
    "address": "po1cPf1eyUJJPqULw4so3T4JU9pdFn83CDyuLEKFAau",
    "metadata": {
        "name": "policy_engine",
        "version": "0.0.1",
        "spec": "0.1.0",
        "description": "The Policy Registry Program (PRP) enables the creation of policies that can be used to control the flow of funds in a programmatic way."
    },
    "instructions": [
        {
            "name": "attach_to_policy_account",
            "docs": [
                "attach a policy"
            ],
            "discriminator": [
                247,
                116,
                130,
                17,
                89,
                232,
                103,
                16
            ],
            "accounts": [
                {
                    "name": "payer",
                    "writable": true,
                    "signer": true
                },
                {
                    "name": "signer",
                    "signer": true
                },
                {
                    "name": "policy_engine",
                    "writable": true
                },
                {
                    "name": "policy_account",
                    "writable": true,
                    "pda": {
                        "seeds": [
                            {
                                "kind": "account",
                                "path": "policy_engine"
                            }
                        ]
                    }
                },
                {
                    "name": "system_program",
                    "address": "11111111111111111111111111111111"
                }
            ],
            "args": [
                {
                    "name": "identity_filter",
                    "type": {
                        "defined": {
                            "name": "IdentityFilter"
                        }
                    }
                },
                {
                    "name": "policy_type",
                    "type": {
                        "defined": {
                            "name": "PolicyType"
                        }
                    }
                }
            ]
        },
        {
            "name": "create_policy_account",
            "docs": [
                "policies",
                "create policy account"
            ],
            "discriminator": [
                52,
                228,
                143,
                138,
                102,
                135,
                59,
                193
            ],
            "accounts": [
                {
                    "name": "payer",
                    "writable": true,
                    "signer": true
                },
                {
                    "name": "signer",
                    "signer": true
                },
                {
                    "name": "policy_engine",
                    "writable": true
                },
                {
                    "name": "policy_account",
                    "writable": true,
                    "pda": {
                        "seeds": [
                            {
                                "kind": "account",
                                "path": "policy_engine"
                            }
                        ]
                    }
                },
                {
                    "name": "system_program",
                    "address": "11111111111111111111111111111111"
                }
            ],
            "args": [
                {
                    "name": "identity_filter",
                    "type": {
                        "defined": {
                            "name": "IdentityFilter"
                        }
                    }
                },
                {
                    "name": "policy_type",
                    "type": {
                        "defined": {
                            "name": "PolicyType"
                        }
                    }
                }
            ]
        },
        {
            "name": "create_policy_engine",
            "docs": [
                "create a policy registry"
            ],
            "discriminator": [
                85,
                105,
                207,
                153,
                73,
                125,
                225,
                54
            ],
            "accounts": [
                {
                    "name": "payer",
                    "writable": true,
                    "signer": true
                },
                {
                    "name": "signer",
                    "signer": true
                },
                {
                    "name": "asset_mint"
                },
                {
                    "name": "policy_engine_account",
                    "writable": true,
                    "pda": {
                        "seeds": [
                            {
                                "kind": "account",
                                "path": "asset_mint"
                            }
                        ]
                    }
                },
                {
                    "name": "extra_metas_account",
                    "writable": true,
                    "pda": {
                        "seeds": [
                            {
                                "kind": "const",
                                "value": [
                                    101,
                                    120,
                                    116,
                                    114,
                                    97,
                                    45,
                                    97,
                                    99,
                                    99,
                                    111,
                                    117,
                                    110,
                                    116,
                                    45,
                                    109,
                                    101,
                                    116,
                                    97,
                                    115
                                ]
                            },
                            {
                                "kind": "account",
                                "path": "asset_mint"
                            }
                        ]
                    }
                },
                {
                    "name": "system_program",
                    "address": "11111111111111111111111111111111"
                }
            ],
            "args": [
                {
                    "name": "authority",
                    "type": "pubkey"
                },
                {
                    "name": "delegate",
                    "type": {
                        "option": "pubkey"
                    }
                }
            ]
        },
        {
            "name": "create_tracker_account",
            "docs": [
                "create tracker account"
            ],
            "discriminator": [
                40,
                16,
                40,
                191,
                109,
                177,
                83,
                190
            ],
            "accounts": [
                {
                    "name": "payer",
                    "writable": true,
                    "signer": true
                },
                {
                    "name": "owner"
                },
                {
                    "name": "asset_mint"
                },
                {
                    "name": "tracker_account",
                    "writable": true,
                    "pda": {
                        "seeds": [
                            {
                                "kind": "account",
                                "path": "asset_mint"
                            },
                            {
                                "kind": "account",
                                "path": "owner"
                            }
                        ]
                    }
                },
                {
                    "name": "system_program",
                    "address": "11111111111111111111111111111111"
                },
                {
                    "name": "event_authority",
                    "pda": {
                        "seeds": [
                            {
                                "kind": "const",
                                "value": [
                                    95,
                                    95,
                                    101,
                                    118,
                                    101,
                                    110,
                                    116,
                                    95,
                                    97,
                                    117,
                                    116,
                                    104,
                                    111,
                                    114,
                                    105,
                                    116,
                                    121
                                ]
                            }
                        ]
                    }
                },
                {
                    "name": "program"
                }
            ],
            "args": []
        },
        {
            "name": "detach_from_policy_account",
            "docs": [
                "remove policy"
            ],
            "discriminator": [
                81,
                24,
                116,
                10,
                12,
                108,
                109,
                242
            ],
            "accounts": [
                {
                    "name": "payer",
                    "writable": true,
                    "signer": true
                },
                {
                    "name": "signer",
                    "signer": true
                },
                {
                    "name": "policy_engine",
                    "writable": true
                },
                {
                    "name": "policy_account",
                    "writable": true,
                    "pda": {
                        "seeds": [
                            {
                                "kind": "account",
                                "path": "policy_engine"
                            }
                        ]
                    }
                },
                {
                    "name": "system_program",
                    "address": "11111111111111111111111111111111"
                }
            ],
            "args": [
                {
                    "name": "hash",
                    "type": "string"
                }
            ]
        },
        {
            "name": "execute_transaction",
            "docs": [
                "execute transfer hook"
            ],
            "discriminator": [
                105,
                37,
                101,
                197,
                75,
                251,
                102,
                26
            ],
            "accounts": [
                {
                    "name": "source_account"
                },
                {
                    "name": "asset_mint"
                },
                {
                    "name": "destination_account"
                },
                {
                    "name": "owner_delegate"
                },
                {
                    "name": "extra_metas_account",
                    "pda": {
                        "seeds": [
                            {
                                "kind": "const",
                                "value": [
                                    101,
                                    120,
                                    116,
                                    114,
                                    97,
                                    45,
                                    97,
                                    99,
                                    99,
                                    111,
                                    117,
                                    110,
                                    116,
                                    45,
                                    109,
                                    101,
                                    116,
                                    97,
                                    115
                                ]
                            },
                            {
                                "kind": "account",
                                "path": "asset_mint"
                            }
                        ]
                    }
                },
                {
                    "name": "policy_engine_account"
                },
                {
                    "name": "identity_registry",
                    "address": "idtynCMYbdisCTv4FrCWPSQboZb1uM4TV2cPi79yxQf"
                },
                {
                    "name": "identity_registry_account"
                },
                {
                    "name": "receiver_identity_account"
                },
                {
                    "name": "tracker_account",
                    "writable": true
                },
                {
                    "name": "policy_account",
                    "writable": true
                },
                {
                    "name": "instructions_program"
                },
                {
                    "name": "source_identity_account"
                }
            ],
            "args": [
                {
                    "name": "amount",
                    "type": "u64"
                }
            ]
        }
    ],
    "accounts": [
        {
            "name": "PolicyAccount",
            "discriminator": [
                218,
                201,
                183,
                164,
                156,
                127,
                81,
                175
            ]
        },
        {
            "name": "PolicyEngineAccount",
            "discriminator": [
                124,
                85,
                205,
                80,
                2,
                18,
                26,
                45
            ]
        },
        {
            "name": "TrackerAccount",
            "discriminator": [
                83,
                95,
                166,
                148,
                57,
                30,
                90,
                210
            ]
        }
    ],
    "errors": [
        {
            "code": 6000,
            "name": "InvalidPolicy",
            "msg": "Invalid policy passed"
        },
        {
            "code": 6001,
            "name": "TransactionAmountLimitExceeded",
            "msg": "Transaction amount limit exceeded"
        },
        {
            "code": 6002,
            "name": "TransactionAmountVelocityExceeded",
            "msg": "Transaction amount velocity exceeded"
        },
        {
            "code": 6003,
            "name": "TransactionCountVelocityExceeded",
            "msg": "Transaction count velocity exceeded"
        },
        {
            "code": 6004,
            "name": "IdentityLevelLimitExceeded",
            "msg": "Identity level limit exceeded"
        },
        {
            "code": 6005,
            "name": "PolicyEngineFull",
            "msg": "Policy registry is full, cannot add more policies"
        },
        {
            "code": 6006,
            "name": "PolicyNotFound",
            "msg": "Policy not found"
        },
        {
            "code": 6007,
            "name": "IdentityFilterFailed",
            "msg": "Identity filter failed"
        },
        {
            "code": 6008,
            "name": "UnauthorizedSigner",
            "msg": "Unauthorized signer"
        },
        {
            "code": 6009,
            "name": "PolicyAlreadyExists",
            "msg": "Policy already exists"
        },
        {
            "code": 6010,
            "name": "MaxBalanceExceeded",
            "msg": "Max balance exceeded"
        },
        {
            "code": 6011,
            "name": "InvalidCpiTransferAmount",
            "msg": "Invalid CPI transfer amount"
        },
        {
            "code": 6012,
            "name": "InvalidCpiTransferMint",
            "msg": "Invalid CPI transfer mint"
        },
        {
            "code": 6013,
            "name": "InvalidCpiTransferProgram",
            "msg": "Invalid CPI transfer program"
        },
        {
            "code": 6014,
            "name": "InvalidPdaPassedIn",
            "msg": "Invalid PDA passed in"
        },
        {
            "code": 6015,
            "name": "TransferHistoryFull",
            "msg": "Transfer history full"
        },
        {
            "code": 6016,
            "name": "TransferPaused",
            "msg": "All Transfers have been paused"
        },
        {
            "code": 6017,
            "name": "ForceFullTransfer",
            "msg": "Expected source account to transfer full amount"
        },
        {
            "code": 6018,
            "name": "HolderLimitExceeded",
            "msg": "Holder limit exceeded"
        },
        {
            "code": 6019,
            "name": "BalanceLimitExceeded",
            "msg": "Balance limit exceeded"
        }
    ],
    "types": [
        {
            "name": "ComparisionType",
            "repr": {
                "kind": "rust"
            },
            "type": {
                "kind": "enum",
                "variants": [
                    {
                        "name": "Or"
                    },
                    {
                        "name": "And"
                    }
                ]
            }
        },
        {
            "name": "IdentityFilter",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "identity_levels",
                        "type": {
                            "array": [
                                "u8",
                                10
                            ]
                        }
                    },
                    {
                        "name": "comparision_type",
                        "type": {
                            "defined": {
                                "name": "ComparisionType"
                            }
                        }
                    }
                ]
            }
        },
        {
            "name": "Policy",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "hash",
                        "type": "string"
                    },
                    {
                        "name": "identity_filter",
                        "type": {
                            "defined": {
                                "name": "IdentityFilter"
                            }
                        }
                    },
                    {
                        "name": "policy_type",
                        "type": {
                            "defined": {
                                "name": "PolicyType"
                            }
                        }
                    }
                ]
            }
        },
        {
            "name": "PolicyAccount",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "version",
                        "type": "u8"
                    },
                    {
                        "name": "policy_engine",
                        "docs": [
                            "Engine account that the policy belongs to"
                        ],
                        "type": "pubkey"
                    },
                    {
                        "name": "policies",
                        "docs": [
                            "Different policies that can be applied to the policy account",
                            "initial max len"
                        ],
                        "type": {
                            "vec": {
                                "defined": {
                                    "name": "Policy"
                                }
                            }
                        }
                    }
                ]
            }
        },
        {
            "name": "PolicyEngineAccount",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "version",
                        "docs": [
                            "version"
                        ],
                        "type": "u8"
                    },
                    {
                        "name": "asset_mint",
                        "docs": [
                            "asset mint"
                        ],
                        "type": "pubkey"
                    },
                    {
                        "name": "authority",
                        "docs": [
                            "authority of the registry"
                        ],
                        "type": "pubkey"
                    },
                    {
                        "name": "delegate",
                        "docs": [
                            "policy delegate"
                        ],
                        "type": "pubkey"
                    },
                    {
                        "name": "max_timeframe",
                        "docs": [
                            "max timeframe of all the policies"
                        ],
                        "type": "i64"
                    }
                ]
            }
        },
        {
            "name": "PolicyType",
            "type": {
                "kind": "enum",
                "variants": [
                    {
                        "name": "IdentityApproval"
                    },
                    {
                        "name": "TransactionAmountLimit",
                        "fields": [
                            {
                                "name": "limit",
                                "type": "u64"
                            }
                        ]
                    },
                    {
                        "name": "TransactionAmountVelocity",
                        "fields": [
                            {
                                "name": "limit",
                                "type": "u64"
                            },
                            {
                                "name": "timeframe",
                                "type": "i64"
                            }
                        ]
                    },
                    {
                        "name": "TransactionCountVelocity",
                        "fields": [
                            {
                                "name": "limit",
                                "type": "u64"
                            },
                            {
                                "name": "timeframe",
                                "type": "i64"
                            }
                        ]
                    },
                    {
                        "name": "MaxBalance",
                        "fields": [
                            {
                                "name": "limit",
                                "type": "u64"
                            }
                        ]
                    },
                    {
                        "name": "TransferPause"
                    },
                    {
                        "name": "ForceFullTransfer"
                    },
                    {
                        "name": "HolderLimit",
                        "fields": [
                            {
                                "name": "limit",
                                "type": "u64"
                            },
                            {
                                "name": "current_holders",
                                "type": "u64"
                            }
                        ]
                    },
                    {
                        "name": "BalanceLimit",
                        "fields": [
                            {
                                "name": "limit",
                                "type": "u128"
                            },
                            {
                                "name": "current_balance",
                                "type": "u128"
                            }
                        ]
                    }
                ]
            }
        },
        {
            "name": "TrackerAccount",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "version",
                        "type": "u8"
                    },
                    {
                        "name": "asset_mint",
                        "type": "pubkey"
                    },
                    {
                        "name": "owner",
                        "type": "pubkey"
                    },
                    {
                        "name": "transfers",
                        "type": {
                            "vec": {
                                "defined": {
                                    "name": "Transfer"
                                }
                            }
                        }
                    }
                ]
            }
        },
        {
            "name": "Transfer",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "amount",
                        "type": "u64"
                    },
                    {
                        "name": "timestamp",
                        "type": "i64"
                    }
                ]
            }
        }
    ]
}
